it-swarm.asia

قاعدة صلبة وسريعة لتضمين الأعمدة في الفهرس

هل هناك أي قاعدة صلبة وسريعة لتحديد الأعمدة وبأي ترتيب يجب وضعها في تضمين في فهرس غير مجمع. كنت أقرأ هذا المنشور للتو https://stackoverflow.com/questions/1307990/why-use-the-include-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)

والشيء الذي يقود الملصق ليقرر الاحتفاظ بعمود LastName مدرجًا. لماذا لا أعمدة أخرى؟ وكيف نقرر بأي ترتيب يجب أن نحتفظ بالأعمدة هناك؟

38
Rocky Singh

اقتراح المؤشر هذا بواسطة marc_s خاطئ. لقد أضفت تعليقًا. (وكانت إجابتي مقبولة أيضًا!)

سيكون فهرس هذا الاستعلام

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

عادة ما يكون الفهرس

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

أين:

  • KeyColList = أعمدة المفاتيح = تستخدم لتقييد الصف ومعالجته
    أين ، الانضمام ، ترتيب حسب ، تجميع حسب الخ
  • NonKeyColList = أعمدة غير رئيسية = تستخدم في SELECT والتجميع (مثل SUM (col)) بعد التحديد/التقييد
48
gbn

أعطت JNK و gbn إجابات رائعة ، ولكن من المفيد أيضًا النظر في الصورة الكبيرة - وليس التركيز فقط على استعلام واحد. على الرغم من أن هذا الاستعلام الخاص قد يستفيد من فهرس (# 1):

Employee(DepartmentID) INCLUDE (Lastname, EmployeeID)

لا يساعد هذا الفهرس على الإطلاق إذا تغير الاستعلام قليلاً ، مثل:

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

سوف يحتاج هذا إلى الفهرس (# 2):

Employee(DepartmentID, LastName) INCLUDE (EmployeeID)

تخيل أنه كان لديك 1000 موظف في القسم 5. باستخدام الفهرس رقم 1 ، للعثور على جميع علامات سميث ، ستحتاج إلى البحث في جميع الصفوف البالغ عددها 1000 في القسم 5 ، لأن الأعمدة المضمنة ليست جزءًا من المفتاح. باستخدام الفهرس رقم 2 ، يمكنك البحث مباشرةً عن القسم 5 ، LastName Smith.

وبالتالي فإن الفهرس رقم 2 أكثر فائدة في خدمة مجموعة أوسع من الاستعلامات - ولكن التكلفة هي مفتاح فهرس أكثر انتفاخًا ، مما سيجعل الصفحات غير الورقية من الفهرس أكبر. سيكون كل نظام مختلفًا ، لذلك لا توجد قاعدة عامة هنا.


كملاحظة جانبية ، تجدر الإشارة إلى أنه إذا كان EmployeeID هو مفتاح التجميع لهذا الجدول - بافتراض فهرس مجمع - فأنت لست بحاجة إلى تضمين EmployeeID - فهو موجود في جميع الفهارس غير المجمعة ، مما يعني أن المؤشر رقم 2 يمكن أن كن

Employee(DepartmentID, LastName)
19
Jim McLeod

لست متأكدا كيف حصلت على هذا الأول. بالنسبة لي ، لهذا الاستعلام ، سأستخدم:

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

لا توجد "قاعدة صلبة وسريعة" لأي شيء تقريبًا في SQL.

ولكن ، على سبيل المثال ، الحقل الوحيد الذي سيستخدمه الفهرس هو DepartmentID لأنه موجود في جملة WHERE.

الحقول الأخرى تحتاج فقط للوصول إليها بسهولة. تقوم بتحديد بناءً على DepartmentID ثم INCLUDE تحتوي هذه الحقول على عقدة طرفية للفهرس.

لا تريد استخدام الأمثلة الأخرى لأنها لن تعمل مع هذا الفهرس.

فكر في الفهرس مثل دفتر الهاتف. يتم ترتيب معظم دفاتر الهاتف حسب الاسم الأخير ، الاسم الأول ، الحرف الأوسط. إذا كنت تعرف الاسم الأول لشخص ما ، ولكن ليس اسمه الأخير ، فلن يكون دليل الهاتف جيدًا حيث لا يمكنك البحث عن الاسم الأول بناءً على ترتيب فهرس دفتر الهاتف.

تعتبر حقول INCLUDE مثل رقم الهاتف والعنوان وما إلى ذلك من المعلومات الأخرى لكل إدخال في الكتاب.

تحرير:

لمزيد من التوضيح لماذا لا تستخدم:

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

هذا الفهرس مفيد فقط إذا كان لديك EmployeeID أو كلاهما EmployeeID و LastName في عبارة WHERE. هذا إلى حد كبير المقابل ما تحتاجه لهذا الاستعلام.

7
JNK

أعتقد أنه لا يزال بإمكانك استخدام فهرس (الموظف_المعرّف ، القسم_المعروف) ، ولكن يجب عليك تضمين سطر "وهمي" في العبارة حيث ، مثل: "الموظف_المعرّف = الموظف_المعروف"

  • وجود فهرس في (الموظف_الموصل_المعروف_المعروف)
  • الاضطرار إلى البحث/التقييد فقط على معرف القسم
  • مع العلم أنه لن يستخدم الفهرس منذ الترتيب الخاطئ (أو تغيرت الأمور الآن ، ولم تعد هناك حاجة إلى "الحيلة" التالية. أنا "oldy"؟) .
  • استخدام تريك "القديمة"؟

    اختر * من إمبراطورية الموظف
    حيث emp.ployee_id = emp.ployee_id
    و emp.department_id = 5

(لذلك لا أركز على الجزء المتضمن هنا من Lastname ، ولكن على نعم/أو عدم استخدام المفتاح.)

أطيب التحيات،

ميغيل

0
Miguel Leeuwe