আউটার প্রয়োগ বনাম বাম যোগদানের পারফরম্যান্স


37

আমি এসকিউএল সার্ভার 2008 আর 2 ব্যবহার করছি

আমি কেবল এসকিউএল-এ আবেদন করেছি এবং পছন্দ করেছি যে এটি কীভাবে এতগুলি সমস্যার সমাধান করে,

ফলাফল পেতে আমি 2 টি বাম জোড় ব্যবহার করছিলাম এমন অনেকগুলি সারণী, আমি 1 বহিরাগত প্রয়োগ পেতে সক্ষম হয়েছি।

আমার স্থানীয় ডিবি টেবিলগুলিতে আমার অল্প পরিমাণে ডেটা রয়েছে এবং স্থাপনার পরে কোডটি কমপক্ষে 20 গুণ বড় ডেটাতে চালিত হওয়ার কথা।

আমি উদ্বিগ্ন যে বহিরাগত প্রয়োগে বিপুল পরিমাণে ডেটার জন্য 2 বামে যোগদানের শর্তের চেয়ে বেশি সময় নিতে পারে,

যে কেউ কীভাবে ঠিকভাবে কাজ করে এবং কীভাবে এটি খুব বড় ডেটাতে পারফরম্যান্সকে প্রভাব ফেলবে তা বলতে পারে, যদি সম্ভব হয় তবে প্রতিটি টেবিলের আকারের সাথে কিছু আনুপাতিক সম্পর্ক যেমন আনুপাতিক যেমন এন 1 ^ 1 বা এন 1 ^ 2 ... যেখানে এন 1 টেবিলের সারি সংখ্যা 1।

2 টি বাম যোগ দিয়ে কোয়েরি এখানে দেওয়া আছে

select EC.*,DPD.* from Table1 eC left join
  (
   select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
   group by member_id,parent_gid,child_gid,LOB,group_gid

  ) DPD2 on DPD2.parent_gid = Ec.parent_gid
        AND DPD2.child_gid = EC.child_gid
        AND DPD2.member_id = EC.member_id
        AND DPD2.LOB = EC.default_lob
        AND DPD2.group_gid = EC.group_gid
  left join
  Table2 dpd on dpd.parent_gid = dpd2.parent_gid 
            and dpd.child_gid = dpd2.child_gid
            and dpd.member_id = dpd2.member_id 
            and dpd.group_gid = dpd2.group_gid 
            and dpd.LOB = dpd2.LOB
            and dpd.table2_sid = dpd2.mdsid

এখানে বাইরের প্রয়োগের সাথে ক্যোয়ারী দেওয়া হচ্ছে

select * from Table1 ec   
OUTER APPLY (
      select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
                    from Table2 DPD 
                    where DPD.parent_gid = Ec.parent_gid
                    AND DPD.child_gid = EC.child_gid
                    AND DPD.member_id = EC.member_id
                    AND DPD.LOB = EC.default_lob
                    AND DPD.group_gid = EC.group_gid
                    order by DPD.table2_sid desc
     ) DPD 

উত্তর:


44

যে কেউ কার্যকরভাবে কীভাবে কাজ করে এবং কীভাবে এটি খুব বড় ডেটাতে পারফরম্যান্সকে প্রভাব ফেলবে তা বলতে পারে

APPLYএকটি পারস্পরিক সম্পর্কযুক্ত যোগদান ( LATERAL JOINকিছু পণ্য এবং এসকিউএল স্ট্যান্ডার্ডের নতুন সংস্করণগুলিতে একটি বলা হয় )। যেকোন যৌক্তিক নির্মাণের মতো এটিরও কার্যক্ষমতাতে সরাসরি প্রভাব নেই। নীতিগতভাবে, আমাদের যে কোনও যুক্তিযুক্ত সমতুল্য সিনট্যাক্স ব্যবহার করে একটি কোয়েরি লিখতে সক্ষম হওয়া উচিত এবং অপটিমাইজার আমাদের ইনপুটটিকে ঠিক একই শারীরিক সম্পাদন পরিকল্পনায় রূপান্তরিত করতে পারে।

অবশ্যই এটির প্রতিটি সম্ভাব্য রূপান্তর জানতে ও অপ্টিমাইজারের প্রয়োজন হবে এবং প্রতিটিটি বিবেচনা করার জন্য সময় থাকতে হবে। এই প্রক্রিয়াটি মহাবিশ্বের বর্তমান বয়সের চেয়ে বেশি সময় নিতে পারে, তাই বেশিরভাগ বাণিজ্যিক পণ্য এই পদ্ধতিকে গ্রহণ করে না। অতএব, কোয়েরি সিনট্যাক্সের চূড়ান্ত কার্যকারিতার উপর এবং প্রায়শই প্রভাব ফেলতে পারে, তবে কোনটি ভাল এবং কেন তা সম্পর্কে সাধারণ বিবৃতি দেওয়া শক্ত।

এর নির্দিষ্ট ফর্মটি OUTER APPLY ( SELECT TOP ... )সম্ভবত এসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে কোনও পারস্পরিক সম্পর্কযুক্ত নেস্টযুক্ত লুপগুলিতে যোগদানের কারণ হতে পারে, কারণ এই প্যাটার্নটিকে একটি সমতুল্য রূপান্তর করতে অপ্টিমাইজারটিতে যুক্তি নেই JOIN। বহিরাগত ইনপুট বড় হলে এবং অভ্যন্তরীণ ইনপুটটি আনইনডেক্স করা না থাকলে বা প্রয়োজনীয় পৃষ্ঠাগুলি ইতিমধ্যে মেমরিতে না থাকলে ক্যারলেলেটেড নেস্টেড লুপস জয়েন ভাল সম্পাদন করতে পারে না। তদুপরি, অপ্টিমাইজারের ব্যয় মডেলের নির্দিষ্ট উপাদানগুলির অর্থ JOINএকটি সমান্তরাল বাস্তবায়ন পরিকল্পনা তৈরির জন্য শব্দার্থ-অভিন্নের চেয়ে কমলেস্টেড নেস্টেড লুপগুলিতে যোগদানের সম্ভাবনা কম ।

আমি একক বাম যোগ এবং সারি_সংখ্যার () দিয়ে একই ক্যোরি তৈরি করতে সক্ষম হয়েছি

এটি সাধারণ ক্ষেত্রে আরও ভাল বা নাও হতে পারে। প্রতিনিধি ডেটা সহ আপনার উভয় বিকল্পের পারফরম্যান্স পরীক্ষা করতে হবে। LEFT JOINএবং ROW_NUMBERঅবশ্যই আরও দক্ষ হতে সম্ভাবনা রয়েছে, কিন্তু এটা সুনির্দিষ্ট কোয়েরি পরিকল্পনা আকৃতি মনোনীত উপর নির্ভর করে। এই পদ্ধতির দক্ষতা প্রভাবিতকারী প্রাথমিক কারণগুলি হ'ল প্রয়োজনীয় কলামগুলি কভার করার জন্য সূচকের সহজলভ্যতা এবং প্রয়োজনীয় ধারাগুলি PARTITION BYএবং ORDER BYধারাগুলি সরবরাহ করা। দ্বিতীয় ফ্যাক্টরটি হ'ল টেবিলের আকার। একটি দক্ষ এবং ভাল- সূচকযুক্ত যদি সর্বোত্তম সূচকের সাথে ক্যোরিটি সংশ্লিষ্ট টেবিলের তুলনামূলকভাবে ছোট অংশটিকে স্পর্শ করে তবে APPLYআউট-পারফর্ম করতে পারে ROW_NUMBER। পরীক্ষা করা দরকার is


2

প্রথম ক্যোয়ারী স্কেল সার্ভারের কেবলমাত্র একটি অনুরোধের মাধ্যমে সমান্তরালভাবে চলতে পারে। এটি সমস্ত রেকর্ড এনেছে এবং ফিল্টার মানদণ্ডের ভিত্তিতে আউটপুট দেয়।

তবে দ্বিতীয়টির ক্ষেত্রে এটি সারি সারি চালিয়ে যায় এবং প্রতিটি সারির জন্য টেবিল 2 স্ক্যান করে ফলাফলের সাথে সংযুক্ত করা হবে।

যদি আপনার বাইরের ক্যোয়ারিতে কম রেকর্ড থাকে তবে দ্বিতীয়টি ভাল (আউটর অ্যাপ্লাই)। তবে যদি প্রথম ক্যোয়ারিতে আরও ডেটা পাওয়া যায় তবে আপনার প্রথমটি ব্যবহার করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.