সূচী অনুসন্ধান বনাম সূচক স্ক্যান


64

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

এবং সূচক সন্ধান এবং একটি সূচক স্ক্যানের মধ্যে পার্থক্য কী?

কোনটি আরও ভাল পারফর্ম করে?

কীভাবে এসকিউএল একে অপরকে বেছে নিতে পারে?

আমি বুঝতে পারি এটি 3 টি প্রশ্ন তবে আমি মনে করি প্রথমটির উত্তর দেওয়া অন্যদের ব্যাখ্যা করবে।


6
ব্যবহার-সূচক-লুকের বিষয়ে আপনার কাছে একটি দুর্দান্ত রেফারেন্স রয়েছে ।
মারিয়ান

7
সমস্ত স্ক্যান খারাপ হয় না - কখনও কখনও এটি ক্যোরিয়াকে সন্তুষ্ট করার সবচেয়ে কার্যকর উপায়। এছাড়াও লক্ষ করুন যে সমস্ত সেক সিকস নয় - প্রায়শই সেগুলি আসলে রেঞ্জ স্ক্যান হয় এবং সন্ধানটি কেবলমাত্র এটি কীভাবে ব্যাপ্তিটির শুরুতে পৌঁছেছে তা নির্দেশ করে ।
অ্যারন বার্ট্র্যান্ড

@ অ্যারোনবার্ট্র্যান্ড তবে এটি যদি পরিসীমা শুরু করে এবং এটি পড়তে পারে, এর মূলত অর্থ হল যেভাবেই আপনার ডেটা দরকার। এছাড়াও, এটি পরিসীমাটির শেষ সন্ধান করে।
জর্জ পোলেভয়

উত্তর:


76

সংক্ষিপ্ত সংস্করণ: সন্ধান করা আরও ভাল

কম সংক্ষিপ্ত সংস্করণ: সন্ধানটি সাধারণত অনেক বেশি ভাল তবে অনেকগুলি সিক্স (উদাহরণস্বরূপ বাজে ক্যারলেটেড সাব-কোয়েরিগুলির সাথে খারাপ কোয়েরি ডিজাইনের কারণে বা আপনি কার্সার অপারেশন বা অন্যান্য লুপে অনেকগুলি অনুসন্ধান করছেন) এর চেয়ে খারাপ হতে পারে be স্ক্যান করুন, বিশেষত যদি আপনার কোয়েরিতে প্রভাবিত টেবিলের বেশিরভাগ সারি থেকে তথ্য ফেরত আসা শেষ হয়ে যায়।

কর্মক্ষমতা সম্পর্কিত প্রভাবগুলি সম্পূর্ণরূপে বোঝার জন্য ডেটা সন্ধানের ক্রিয়াকলাপের জন্য এটি পুরো পরিবারকে কভার করতে সহায়তা করে।

টেবিল স্ক্যান: আপনার প্রশ্নের সাথে প্রাসঙ্গিক কোনও সূচি ছাড়াই পরিকল্পনাকারী একটি টেবিল স্ক্যান ব্যবহার করতে বাধ্য হন যার অর্থ প্রতি সারিটি তাকাতে হয়। এটি ডিস্ক থেকে টেবিলের ডেটা পড়ার সাথে সম্পর্কিত প্রতিটি পৃষ্ঠার ফলস্বরূপ হতে পারে যা প্রায়শই সবচেয়ে খারাপ পরিস্থিতি। নোট করুন যে কোনও প্রশ্নের জন্য এটি একটি টেবিল স্ক্যান ব্যবহার করবে এমনকি কোনও দরকারী সূচক উপস্থিত থাকলেও - এটি সাধারণত কারণ টেবিলের ডেটা এত ছোট হয় যে সূচীকরণগুলি অতিক্রম করতে আরও ঝামেলা হয় (এটি যদি এমন হয় তবে আপনি আশা করতে পারেন সূচকের চূড়ান্তকরণের পরিমাপটি ভাল বলে ধরে নিয়ে ডেটা বাড়ার সাথে সাথে পরিবর্তনের পরিকল্পনা করুন)।

সারি সন্ধানের সাথে সূচি স্ক্যানগুলি: কোনও সন্ধানের জন্য সরাসরি ব্যবহার করা যায় এমন কোনও সূচি পাওয়া যায় নি তবে ডান কলামগুলিতে একটি সূচক উপস্থিত রয়েছে যা সূচক স্ক্যান ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, যদি আপনার কাছে কলাম 1, কল 2, কল 3 এর সূচী সহ 20 টি কলামযুক্ত একটি বড় টেবিল রয়েছে এবং আপনি ইস্যু করেন SELECT col4 FROM exampletable WHERE col2=616, সেক্ষেত্রে সূচকে ক্যোয়ারীতে col2স্ক্যান করা পুরো টেবিলটি স্ক্যান করার চেয়ে ভাল। মিলের সারিগুলি একবার খুঁজে পাওয়া গেলে তারপরে ডেটা পৃষ্ঠাগুলি পিকআপ কল 4 পড়তে হবে আউটপুট (বা আরও যোগদানের জন্য) যা কোয়েরি প্ল্যানে আপনি যখন দেখেন "বুকমার্ক লুক" এর পর্যায়টি কী।

সারি সন্ধানগুলি ছাড়াই সূচি স্ক্যানগুলি: উপরের উদাহরণটি যদি হয় SELECT col1, col2, col3 FROM exampletable WHERE col2=616তবে ডেটা পৃষ্ঠাগুলি পড়ার জন্য অতিরিক্ত প্রচেষ্টা প্রয়োজন হয় না: একবার সূচী সারিগুলির সাথে মিলে col2=616গেলে সমস্ত অনুরোধ করা ডেটা জানা যায়। এ কারণেই আপনি কখনও কখনও এমন কলামগুলি দেখেন যেগুলি কখনই অনুসন্ধান করা হবে না, তবে আউটপুটটির জন্য অনুরোধ করা হতে পারে, সূচকের শেষে যুক্ত করা হয়েছে - এটি সারি অনুসন্ধানগুলি সংরক্ষণ করতে পারে। শুধুমাত্র এই কারণে এবং এই কারণে কোনও সূচীতে কলাম যুক্ত করার সময় INCLUDE, ইঞ্জিনটি জানানোর জন্য তাদের এই ক্লজটি যুক্ত করুন যে এই কলামগুলির উপর ভিত্তি করে অনুসন্ধানের জন্য সূচী বিন্যাসকে অনুকূলিতকরণের প্রয়োজন নেই (এটি এই কলামগুলিতে করা আপডেটগুলিকে গতি দিতে পারে) । সূচক স্ক্যানগুলি কোনও ফিল্টারিং ধারা ছাড়াও কোয়েরিতে ফলাফল আসতে পারে: SELECT col2 FROM exampletableসারণির পৃষ্ঠাগুলির পরিবর্তে এই উদাহরণ সূচকটি স্ক্যান করবে।

সূচক সিক্স (সারি সন্ধানের সাথে বা ছাড়া) : সন্ধানে সমস্ত সূচক বিবেচনা করা হয় না। ক্যোয়ারির SELECT * FROM exampletable WHERE c1 BETWEEN 1234 AND 4567জন্য ক্যোয়ারী ইঞ্জিনটি প্রথম সারিটি সূচকটিতে গাছ ভিত্তিক অনুসন্ধানের সাথে মিলবে এবং c1তারপরে এটি পরিসীমাটি শেষ না হওয়া পর্যন্ত সূচীটি নেভিগেট করতে পারে (এটি একটি প্রশ্নের সাথে একই কারণ c1=1234শর্তের সাথে কোনও =অপারেশনের সাথেও অনেকগুলি সারি মেলে থাকতে পারে )। এর অর্থ সূচক (বা সারণী) এর প্রতিটি পৃষ্ঠার পরিবর্তে কেবল প্রাসঙ্গিক সূচী পৃষ্ঠাগুলি (প্লাস প্রাথমিক অনুসন্ধানের জন্য কয়েকটি প্রয়োজনীয়) পড়তে হবে।

ক্লাস্টারড ইনডেক্স: একটি ক্লাস্টারড ইনডেক্সের সাহায্যে টেবিলের ডেটা পৃথক হিপ স্ট্রাকচারের পরিবর্তে সেই সূচকের পাতার নোডগুলিতে সংরক্ষণ করা হয়। এর অর্থ হ'ল যে সূচিগুলি ব্যবহার করে সারিগুলি সন্ধান করার পরে আর কোনও অতিরিক্ত সারি সন্ধানের প্রয়োজন হবে না [যতক্ষণ না আপনার কাছে TEXTপৃষ্ঠাগুলির অফ-ডেটা যেমন কলাম বা VARCHAR(MAX)লম্বা ডেটাযুক্ত কলামগুলি থাকে]]।

আপনি শুধুমাত্র এই কারণে এক ক্লাস্টার সূচক থাকতে পারে [1] , ক্লাস্টার সূচক হয় পরিবর্তে একটি পৃথক গাদা গঠন থাকার আপনার টেবিল, তাই যদি আপনি ব্যবহার এক [2] বেছে নেওয়া হয়েছে যেখানে আপনি এটি সাবধানে সর্বাধিক লাভ পেতে হবে।

এছাড়াও লক্ষ করুন যে ক্লাস্টারড ইনডেক্সটি টেবিলের জন্য "ক্লাস্টারিং কী" এবং টেবিলের প্রতিটি নন-ক্লাস্টারড ইনডেক্সে অন্তর্ভুক্ত রয়েছে, তাই প্রশস্ত ক্লাস্টারড সূচকটি সাধারণত ভাল ধারণা নয়।

[1] প্রকৃতপক্ষে, আপনি টেবিলের প্রতিটি কলাম কভার বা অন্তর্ভুক্ত নন-ক্লাস্টারযুক্ত সূচকগুলি সংজ্ঞায়িত করে কার্যকরভাবে একাধিক ক্লাস্টার ইনডেক্স করতে পারেন , তবে এটি স্থান অপব্যয় করার সম্ভাবনা রয়েছে যার একটি লেখার পারফরম্যান্স প্রভাব রয়েছে তাই যদি আপনি এটি করা নিশ্চিত করেন তবে আপনার সত্যই দরকার

[2] আমি যখন বলবেন "আপনি একটি ক্লাস্টার সূচক ব্যবহার করুন", নোট সাধারণভাবে বাঞ্ছনীয় যে আপনি কি কি করতে প্রতিটি টেবিলের উপর এক আছে। সমস্ত নিয়মের অফ-আঙুলের সাথে ব্যতিক্রম রয়েছে, সারণীগুলি যেগুলি বাল্ক সন্নিবেশ এবং আনর্ডারড রিড (ইটিএল প্রক্রিয়াগুলির জন্য স্টেজিং টেবিল সম্ভবত) সর্বাধিক সাধারণ উদাহরণ হিসাবে দেখা যায় than

অতিরিক্ত পয়েন্ট: অসম্পূর্ণ স্ক্যানগুলি:

এটি মনে রাখা গুরুত্বপূর্ণ যে বাক্যটির উপর নির্ভর করে কোনও টেবিল / সূচক স্ক্যানটি পুরো টেবিলটি আসলে স্ক্যান করতে পারে না - যদি যুক্তিটি অনুমতি দেয় তবে ক্যোয়ারী প্ল্যানটি এটি প্রাথমিকভাবে বাতিল করতে সক্ষম হতে পারে। এর সহজ উদাহরণ SELECT TOP(1) * FROM HugeTable- আপনি যদি এর জন্য ক্যোয়ারী পরিকল্পনার দিকে নজর দেন তবে আপনি দেখতে পাবেন যে স্ক্যান থেকে কেবল একটি সারি ফিরে এসেছে এবং আপনি যদি আইও এর পরিসংখ্যানটি দেখে থাকেন তবে আপনি দেখতে SET STATISTICS IO ON; SELECT TOP(1) * FROM HugeTableপাবেন যে এটি কেবল খুব অল্প সংখ্যকই পড়েছে পৃষ্ঠাগুলি (সম্ভবত কেবল একটি)

একই ঘটতে পারে যদি কোনও WHEREবা শিরোনামের ভবিষ্যদ্বাণীটি JOIN ... ONস্ক্যানের সাথে একই সাথে চালানো যায় তবে এটির ডেটা যদি উত্স হয়। কোয়েরি পরিকল্পনাকারী / রানার কখনও কখনও স্ক্যানগুলির প্রাথমিক সমাপ্তিটিকে এভাবে চালিয়ে যাওয়ার জন্য ডেটা উত্সগুলির দিকে ফিরে ভবিষ্যদ্বাণীগুলি সম্পর্কে প্রজ্ঞাবান সম্পর্কে খুব চতুর হতে পারে (এবং কখনও কখনও আপনি এগুলি করতে সহায়তা করার জন্য কোয়েরিগুলিকে পুনর্বিন্যাসে চালাক হতে পারেন!)! যদিও ডাটা ডান-থেকে-বাম মান ক্যোয়ারী পরিকল্পনা প্রদর্শনে তীর অনুযায়ী বয়ে যুক্তিবিজ্ঞান বাম-থেকে-ডান রান আগেই পরবর্তী শুরু করতে পারেন প্রতিটি পদক্ষেপ (ডান-থেকে-বাম) অগত্যা সমাপ্তির চালানো হয় না। উপরের সাধারণ উদাহরণে যদি আপনি কোয়েরি প্ল্যানের প্রতিটি ব্লককে এজেন্ট হিসাবে দেখেন তবে SELECTএজেন্ট TOPএজেন্টকে একটি সারির জন্য জিজ্ঞাসা করে যা ঘুরে ফিরে জিজ্ঞাসা করেTABLE SCANএজেন্ট একজনের জন্য, তারপরে SELECTএজেন্ট অন্যটির জন্য জিজ্ঞাসা করে তবে TOPএজেন্ট জানে যে টেবিল পাঠককে জিজ্ঞাসা করার কোনও দরকার নেই, SELECTএজেন্ট একটি "আর কোনও প্রাসঙ্গিক নয়" প্রতিক্রিয়া পেয়ে যায় এবং জানে যে সমস্ত কাজ সম্পন্ন হয়েছে। অনেক অপারেশন আরো জটিল উদাহরণ একটি টেবিল / সূচক স্ক্যান সত্যিই তাই প্রায়ই অবশ্যই অপ্টিমাইজেশান এই সাজানোর ব্লক করে যে সারি পড়া, কিন্তু সতর্কতা অবলম্বন উপসংহার যে কোনো স্ক্যান একটি ব্যয়বহুল অপারেশন হওয়া আবশ্যক ঝাঁপ না।


6

সাধারণত, সিক্সগুলি ভাল, স্ক্যানগুলি খারাপ are

সন্ধানগুলি যেখানে ক্যোরিটি সূচকটির কার্যকর ব্যবহার করতে সক্ষম হয় এবং এটির প্রয়োজনীয় সারিগুলি সন্ধান করতে এটি ব্যবহার করে।

স্ক্যানগুলি হল যেখানে ক্যোয়ারী পুরো সূচকটি অনুসন্ধান করছে যা তার প্রয়োজন তা অনুসন্ধান করার চেষ্টা করছে।

এসকিউএল কীভাবে নির্বাচন করে? ক্যোয়ারী অপটিমাইজারের অভ্যন্তরের গভীরে, আপনার ক্যোয়ারী এবং উপলব্ধ সূচি এবং সেই সূচকগুলির সাথে সম্পর্কিত পরিসংখ্যান সম্পর্কিত তথ্যের ভিত্তিতে সিদ্ধান্ত নেওয়া হয়।

এখানে কয়েকটি বই পড়ার আগ্রহী হতে পারে - এটি http://www.red-gate.com/commune/books/ এ রেড-গেট বইয়ের দোকান থেকে উভয়ই

  • অনুদান ফ্রেঞ্চি দ্বারা এসকিউএল সার্ভার এক্সিকিউশন পরিকল্পনা
  • বেনজামিন নেভেরেজের কোয়েরি অপ্টিমাইজারের ভিতরে
  • এসকিউএল সার্ভারের পরিসংখ্যানগুলি হোলার শ্মলিংয়ের দ্বারা

7
একই পরিকল্পনার জন্য একটি একক টেবিল স্ক্যান ভাল, এক মিলিয়ন সিক্স খারাপ। সুতরাং আপনার প্রথম বিবৃতি সম্পূর্ণ সঠিক নয়।
মারিয়ান 20'13

প্রকৃতপক্ষে, সূচীর অন্বেষণ এবং সূচক স্ক্যানগুলির নিজস্ব ব্যবহার রয়েছে, আপনি অন্তর্নিহিত সারণী এবং প্রশ্নের প্রসঙ্গে ছাড়া অন্যটির চেয়ে ভাল একটি বলতে পারবেন না। বেশিরভাগ সময়, যদি কোনও টেবিলটির পরিসংখ্যানটি সঠিক না থাকে তবে এক্সিকিউশন প্ল্যানটি সাব-অনুকূল হিসাবে প্রকাশিত হতে পারে, যেমন একটি সূচী অনুসন্ধানটি ভুলভাবে একটি সূচক স্ক্যানের উপরে বেছে নেওয়া হয় এবং এর বিপরীতে।
jyao

5

আপনি বিষয় খনন করতে চান, একটি খুব সহায়ক বই (অন্তত আমার জন্য) গ্রান্ট Fritchey দ্বারা SQL সার্ভার এক্সেকিউশন কামাল, RedGate এ অবাধে পাওয়া যায় এখানে

আপনার যদি এমন কোনও প্রশ্ন থাকে তবে

SELECT *
FROM myTable

এসকিউএল সার্ভার সম্ভবত একটি সূচক স্ক্যান ব্যবহার করবে, কারণ প্রয়োজনীয় ফলাফলগুলি প্রদর্শন করতে এটি সমস্ত সারি পেরিয়ে যেতে হবে।

বিপরীতে,

SELECT *
FROM myTable
WHERE myID = 1

অবশ্যই একটি সূচক সন্ধানের ফলাফল হবে। এসকিউএল সার্ভার মাইআইডি সূচকের বি-ট্রি কাঠামো ব্যবহার করবে এবং সঠিক লাইনটি পুনরুদ্ধার করা আরও দ্রুত হবে।


আমি জানি না আমি "অবশ্যই" এর সাথে একমত হই কিনা - এমনকি যদি সূচকের একটি শীর্ষস্থানীয় কলাম হিসাবে মাইআইডি থাকে তবে একটি সন্ধানটি সর্বোত্তম উত্তর হতে পারে না (এটি অনেকগুলি বিষয়ের উপর নির্ভর করে যেমন এটি অনন্য কিনা - যা হতে পারে গ্রাহকদের সারণীতে সত্য তবে অর্ডার সারণীতে গ্রাহক আইডি-র জন্য নয়, কয়টি কলাম কভার করতে হবে তবে সূচীতে নেই, ইত্যাদি)।
অ্যারন বার্ট্র্যান্ড

আমি মনে করি না যে এই উত্তরটি সত্যই উত্থাপিত প্রশ্নগুলি কভার করেছে।
জিরো 3

5

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

তবে উদাহরণ হিসাবে, বলুন যে আপনার কোড প্রদত্ত ফিল্টারগুলিতে কলাম এ এবং কলাম বিয়ের জন্য অনুসন্ধান করছে, তবে আপনি কলাম সি এবং কলাম ই এর মানগুলিও ফিরিয়ে দিতে চান, আপনি কলাম এ এবং বিতে একটি তালিকা তৈরি করতে চাইবেন ইনক্লুডের সাথে কলাম সি এবং ই সমন্বিত বিকল্প That এইভাবে একটি একক সূচী আপনার প্রয়োজনীয় সমস্ত কিছু ফিরিয়ে দেবে, কারণ একই সারিতে অন্যান্য মানগুলি (সি এবং ই) পুনরুদ্ধার করার জন্য অনুসন্ধান করার দরকার নেই।

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