সূচীতে কলামগুলি অন্তর্ভুক্ত করার জন্য কঠোর এবং দ্রুত নিয়ম


38

কোন কলামগুলি এবং কোন ক্রমে এটি নন ক্লাস্টারড ইনডেক্সে অন্তর্ভুক্ত করা উচিত তা সিদ্ধান্ত নেওয়ার জন্য কি কোনও কঠোর এবং দ্রুত নিয়ম রয়েছে? আমি এই পোস্টটি সবেমাত্র https://stackoverflow.com/questions/1307990/why-use-the-incolve-clause-when-creating-an-index পড়ছিলাম এবং আমি খুঁজে পেয়েছি যে নিম্নলিখিত প্রশ্নের জন্য:

SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5

পোস্টারটি সূচকটি এভাবে তৈরি করার পরামর্শ দিয়েছে:

CREATE NONCLUSTERED INDEX NC_EmpDep 
  ON Employee(EmployeeID, DepartmentID)
  INCLUDE (Lastname)

এখানে আমার প্রশ্ন আসে কেন আমরা এভাবে সূচি তৈরি করতে পারি না

CREATE NONCLUSTERED INDEX NC_EmpDep 
      ON Employee( EmployeeID, DepartmentID, LastName)

অথবা

    CREATE NONCLUSTERED INDEX NC_EmpDep 
          ON Employee( EmployeeID, LastName)
INCLUDE (DepartmentID)

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


3
একটি অন্তর্ভুক্ত রেকর্ড সন্ধানের পরে আপনার প্রয়োজনীয় ক্ষেত্রগুলি অন্তর্ভুক্ত করা উচিত, আরও ডেটা পাওয়ার জন্য আপনাকে একটি রাউন্ড ট্রিপ ফিরিয়ে আনতে হবে। ইনক্লুডে ক্ষেত্রগুলির ক্রমটি গুরুত্বপূর্ণ নয়।
জিম্বো

রাইক, ব্যক্তিগতভাবে আমি এই পোস্টটি সহায়ক বলে মনে করি।
জেসন ইয়ং

আমি এই প্রশ্নটি পাশাপাশি সহায়ক মনে করি। আসুন ব্যক্তিদের আটকে রাখার পরিবর্তে ভাল প্রশ্ন এবং ভাল উত্তরের দিকে মনোনিবেশ করি ....
ভলভক্স

উত্তর:


47

মার্ক_স দ্বারা সূচকের পরামর্শটি ভুল। আমি একটি মন্তব্য যুক্ত করেছি। (এবং এটি আমার উত্তরও গৃহীত হয়েছিল!)

এই প্রশ্নের জন্য সূচক হবে

CREATE NONCLUSTERED INDEX NC_EmpDep 
  ON Employee(DepartmentID)
  INCLUDE (Lastname, EmployeeID)

একটি সূচক সাধারণত হয়

CREATE INDEX <name> ON <table> (KeyColList) INCLUDE (NonKeyColList)

কোথায়:

  • কী কললিস্ট = মূল কলামগুলি = সারি সীমাবদ্ধতা এবং প্রসেসিংয়ের জন্য ব্যবহৃত
    কোথায়, যোগদানের মাধ্যমে, অর্ডার, গ্রুপের মাধ্যমে ইত্যাদি
  • ননকি কোললিস্ট = অ-কী কলামগুলি নির্বাচন করা / একত্রিতকরণের জন্য ব্যবহৃত (যেমন SUM (কল)) বাছাই / সীমাবদ্ধতার পরে

+1 - আমি সম্মত (আমার উত্তরগুলি দেখুন) যে ওপিতে নমুনা সূচকগুলি ক্যোয়ারের জন্য মূল্যহীন!
জেএনকে

গ্রেট! কীপোললিস্ট এবং ননকি কোলকলিস্টের ক্রমটি কী ঠিক করবে তা আরও একটি বিষয়। আপনি কি আমার উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন? ধরুন এখন আমার ক্যোয়ারী নির্বাচনী কর্মচারী, ডিপার্টমেন্টাল আইডি, কর্মচারী থেকে লাস্ট নেম, বিভাগীয় আইডি = 5, স্টেটআইডি = 4 এখন কতটা সূচক হবে?

@ রকি - NonKeyColListঅর্ডার কিছু যায় আসে না। KeyColListক্রমটি ফ্রিকোয়েন্সি অনুসারে হওয়া উচিত যা আপনি আশা করেন যে সেগুলি ক্যোয়ারিতে ব্যবহৃত হবে। নীচে আমার উত্তরে আমার নোটগুলি দেখুন, তবে এটি Last Name, First Name, Middile Initialকোনও ফোন বইয়ের মতো। দ্বিতীয় ক্ষেত্রটি সন্ধান করার জন্য আপনার প্রথম ক্ষেত্রের প্রয়োজন।
জেএনকে

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

1
@ বিশ্বনাথনআইয়ার এটি আসল অন-ডিস্ক স্টোরেজে যদিও এটি দু'বার যুক্ত হবে না: এসকিউএল সার্ভার এটি সনাক্ত করে। সুতরাং এটির প্রয়োজন নেই তবে এটি বিষয়গুলি পরিষ্কার করে। যাইহোক, আমরা প্রশ্নের কোনও ক্লাস্টার ইনডেক্স জানি না তাই এটি কোনওটিই ধরে নেওয়া নিরাপদ।
gbn

19

জেএনকে এবং জিবিএন দুর্দান্ত উত্তর দিয়েছে, তবে এটি একটি বৃহত চিত্র বিবেচনা করার মতো - কেবল একটিই ক্যোয়ারিতে মনোনিবেশ করে না। যদিও এই নির্দিষ্ট ক্যোয়ারী সূচক (# 1) দ্বারা উপকৃত হতে পারে:

Employee(DepartmentID) INCLUDE (Lastname, EmployeeID)

কোয়েরিটি কিছুটা পরিবর্তিত হলে এই সূচকটি মোটেই সহায়তা করে না যেমন:

SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5 AND LastName = 'Smith'

এটির জন্য সূচকের প্রয়োজন হবে (# 2):

Employee(DepartmentID, LastName) INCLUDE (EmployeeID)

কল্পনা করুন যে বিভাগে আপনার এক হাজার কর্মচারী রয়েছে 5.. সূচক # 1 ব্যবহার করে সমস্ত স্মিথকে খুঁজে পেতে আপনাকে বিভাগ 5 এ সমস্ত 1000 সারি সন্ধান করতে হবে, কারণ অন্তর্ভুক্ত কলামগুলি মূল অংশ নয়। সূচক # 2 ব্যবহার করে আপনি সরাসরি বিভাগ 5, লাস্টনাম স্মিথের কাছে যেতে পারেন।

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


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

Employee(DepartmentID, LastName)

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

1
আমি একেবারে সম্মত - স্পষ্ট হওয়া আরও ভাল, বিশেষত যদি এটির জন্য কোনও দাম হয় না!

1
সেক্ষেত্রে ... আমার অর্থ আমি অন্তর্ভুক্ত ক্লাস্টার কীটি পরীক্ষা করেছি (কর্মচারী স্পষ্টভাবে নয়) এবং এতে কোনও স্থান যুক্ত করা হয়নি। কী কলামগুলিতে এটি করে।
gbn

@gbn হ্যাঁ, ক্লাস্টার কীটির কেবলমাত্র সূচকের পাতাগুলিতে থাকতে হবে, যেখানে ইনক্লুড কলামগুলি থাকে। এটিকে সূচি কীতে স্থানান্তরিত করার অর্থ এটি নন-পাতাগুলিতেও থাকবে। এর ফলে সামান্য বিস্ফোরণ ঘটবে, তবে ভয়াবহ পরিমাণ নয় (মধ্যবর্তী স্তরের পৃষ্ঠাগুলিতে, আপনি একটি পূর্ণসংখ্যা ধরে ধরে পাতা-স্তরের পৃষ্ঠায় আরও 4 বাইট যোগ করবেন)।

এটি দুর্দান্ত উত্তর যা এই নিবন্ধে বর্ণিত কিছু প্রভাব অন্তর্ভুক্ত করেছে: sqlperformance.com/2014/07/sql-indexes/… যদি আপনার ক্যোয়ারী পরিবর্তন হয় তবে আপনার সূচকের প্রয়োজনীয়তাগুলিও করুন। জিমের উত্তরের সাথে আপনি আরও ভাল হতে পারেন তবে আপনি @ জিবিএন উত্তর দিয়ে আরও ভাল করতে পারেন।
জন ওরফে হট

7

আমি নিশ্চিত না যে আপনি কীভাবে প্রথমটি পেয়েছিলেন। আমার জন্য, এই প্রশ্নের জন্য, আমি ব্যবহার করব:

CREATE NONCLUSTERED INDEX NC_EmpDep 
  ON Employee(DepartmentID)
  INCLUDE (EmployeeID, Lastname)

এসকিউএল-তে কোনও কিছুর জন্য একটি "হার্ড এবং দ্রুত নিয়ম" নেই।

তবে, উদাহরণস্বরূপ, সূচকটি কেবলমাত্র ক্ষেত্রটিই ব্যবহার করবে DepartmentIDকারণ এটি WHEREদফাতে রয়েছে।

অন্যান্য ক্ষেত্রগুলি কেবল সেখান থেকে সহজেই অ্যাক্সেসযোগ্য হওয়া দরকার। আপনি উপর ভিত্তি করে নির্বাচন DepartmentIDতারপর INCLUDEসূচক পাত নোড যাদের ক্ষেত্র রয়েছে।

আপনি আপনার অন্যান্য উদাহরণগুলি ব্যবহার করতে চান না কারণ তারা এই সূচকটির জন্য কাজ করবে না।

একটি ফোনের বইয়ের মতো সূচী সম্পর্কে ভাবুন। বেশিরভাগ ফোন বইয়ের নাম শেষ নাম, প্রথম নাম, মধ্য প্রাথমিক by আপনি যদি কারও প্রথম নামটি জানেন, তবে তাদের শেষ নামটি না জানেন, ফোন বইয়ের সূচীর ক্রমের ভিত্তিতে আপনি প্রথম নামটি অনুসন্ধান করতে পারবেন না বলে ফোন বুকটি আপনার পক্ষে ভাল নয়।

INCLUDEক্ষেত্র ফোন নম্বর, ঠিকানা ইত্যাদি গ্রন্থে প্রতিটি এন্ট্রির জন্য অন্যান্য তথ্য মত।

সম্পাদনা করুন:

কেন ব্যবহার করবেন না তা আরও স্পষ্ট করতে:

CREATE NONCLUSTERED INDEX NC_EmpDep 
          ON Employee( EmployeeID, LastName)
INCLUDE (DepartmentID)

এই সূচকটি কেবলমাত্র তখনই কার্যকর যদি আপনার উভয় EmployeeIDবা উভয় থাকে EmployeeID এবং LastNameআপনার WHEREঅনুচ্ছেদে থাকে। আপনার এই ক্যোয়ারির জন্য যা প্রয়োজন তা এটির বেশিরভাগই অপ্পোসিটি


@ আজবাইভেন এটি সত্য, এ কারণেই আমি সম্পাদনাতে যে মন্তব্যটি করেছি তা বলছে আপনার EITHER কর্মচারী বা উভয় কলামের প্রয়োজন।
জেএনকে

দুর দুঃখিত দু: খিত :(
আজবিভেন

0

আমি মনে করি আপনি এখনও (কর্মচারী_আইডি, বিভাগ_আইডি) সূচকটি ব্যবহার করতে সক্ষম হতে পারেন তবে আপনাকে "ডামি" লাইনটি যেখানে বাক্যাংশটিতে অন্তর্ভুক্ত করতে হবে, যেমন: "কর্মী_আইডি = কর্মী_আইডি)

  • (কর্মচারী_আইডি, Departemnent_id) এর উপর একটি সূচক রয়েছে,
  • শুধুমাত্র বিভাগ_আইডিতে সন্ধান / সীমাবদ্ধ করতে হবে
  • বুদ্ধিমান সূচক ব্যবহার করবে না যেহেতু ভুল অর্ডার (অথবা কিছু এখন দ্বারা পরিবর্তিত হয়েছে, এবং নিম্নলিখিত "কৌতুক" আর প্রয়োজন হয়। আমি একটি "গৃহকর্ত্রী" আছি?)
  • "পুরানো" ট্রিক ব্যবহার করবেন?

    কর্মচারী সমষ্টি থেকে * নির্বাচন করুন
    যেখানে emp.employee_id = emp.employee_id
    এবং emp.department_id = 5

(সুতরাং আমি লাস্টনামের এখানে অন্তর্ভুক্ত অংশটির দিকে মনোযোগ দিচ্ছি না, তবে হ্যাঁ / বা কী ব্যবহার করা হচ্ছে না))

আন্তরিক শুভেচ্ছা,

Miguell


2
না, এটি অকেজো এবং কার্যকর নয়।
ypercubeᵀᴹ

বিশেষত, বিভাগ_আইডির সমস্ত দৃষ্টান্তগুলি খুঁজে পেতে প্রতিটি কর্মচারী আইডি অনুসন্ধান করতে এখনও এটি সূচী স্ক্যান করতে হবে 1000. যদি 1000 কর্মী এবং 5 বিভাগ থাকে তবে এসকিউএলকে একটি নির্দিষ্ট বিভাগের সমস্ত সারি সন্ধান করতে সমস্ত 1000 কর্মচারীর সন্ধান করতে হবে।
মার্ক সোওল

এখন বিপরীত কেসটি বিবেচনা করুন (সূচি বিভাগ_আইডিতে রয়েছে, কর্মচারী_আইডি)। স্পষ্টতই এখন কোনও নির্দিষ্ট বিভাগ খুঁজে পাওয়া সহজ, তবে এটিও নোট করুন যে কোনও নির্দিষ্ট কর্মী খুঁজে পেতে, এসকিউএলকে একটি নির্দিষ্ট কর্মচারীর জন্য সমস্ত সারি সন্ধানের জন্য কেবল 5 টি বিভাগের মাধ্যমে স্ক্যান করতে হয়।
মার্ক সোওল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.