ما الفرق بين مسح الجدول ومسح الفهرس المجمع؟

StackOverflow https://stackoverflow.com/questions/18764

  •  09-06-2019
  •  | 
  •  

سؤال

وبما أن كلا من أ Table Scan و أ Clustered Index Scan قم بمسح جميع السجلات الموجودة في الجدول بشكل أساسي، لماذا من المفترض أن يكون فحص الفهرس المجمع أفضل؟

على سبيل المثال - ما هو فرق الأداء بين ما يلي عند وجود العديد من السجلات؟:

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp
هل كانت مفيدة؟

المحلول

في الجدول الذي لا يحتوي على فهرس مجمع (جدول كومة)، لا يتم ربط صفحات البيانات معًا - لذلك يتطلب اجتياز الصفحات ابحث في خريطة تخصيص الفهرس.

ومع ذلك، فإن الجدول متفاوت المسافات يحتوي على ما هو عليه صفحات البيانات مرتبطة في قائمة مرتبطة بشكل مزدوج - إجراء عمليات المسح المتسلسلة بشكل أسرع قليلاً.وبطبيعة الحال، في المقابل، لديك عبء التعامل مع الحفاظ على صفحات البيانات بالترتيب INSERT, UPDATE, ، و DELETE.ومع ذلك، يتطلب جدول الكومة كتابة ثانية إلى IAM.

إذا كان الاستعلام الخاص بك يحتوي على RANGE المشغل (على سبيل المثال: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100)، فإن الجدول المجمع (الذي يكون بترتيب مضمون) سيكون أكثر كفاءة - حيث يمكنه استخدام صفحات الفهرس للعثور على صفحة (صفحات) البيانات ذات الصلة.يجب أن تقوم الكومة بمسح جميع الصفوف، لأنها لا تستطيع الاعتماد على الطلب.

وبطبيعة الحال، يتيح لك الفهرس المتفاوت إجراء بحث INDEX SEEK، وهو مثالي إلى حد كبير للأداء... الكومة التي لا تحتوي على فهارس ستؤدي دائمًا إلى فحص الجدول.

لذا:

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

  • للاستعلام مع أ WHERE الشرط الذي يمكن استيفاءه (جزئيًا على الأقل) بواسطة الفهرس المجمع، فسوف تتقدم في المقدمة بسبب الترتيب - لذلك لن تضطر إلى فحص الجدول بأكمله.

  • بالنسبة للاستعلام الذي لا يرضي الفهرس المجمع، فأنت متعادل إلى حد كبير... مرة أخرى، والفرق الوحيد هو تلك القائمة المرتبطة بشكل مضاعف للمسح المتسلسل.في كلتا الحالتين، أنت دون المستوى الأمثل.

  • ل INSERT, UPDATE, ، و DELETE قد تفوز الكومة وقد لا تفوز.ليس من الضروري أن تحافظ الكومة على النظام، ولكنها تتطلب كتابة ثانية إلى IAM.أعتقد أن الفارق النسبي في الأداء سيكون ضئيلًا، ولكنه يعتمد أيضًا على البيانات.

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

  • INSERT أداء:يفوز الفهرس المتفاوت بحوالي 3% بسبب الكتابة الثانية المطلوبة للكومة.
  • UPDATE أداء:يفوز الفهرس المتفاوت بحوالي 8% بسبب البحث الثاني المطلوب للكومة.
  • DELETE أداء:يفوز الفهرس المتفاوت بحوالي 18% بسبب الحاجة إلى البحث الثاني والحذف الثاني المطلوب من IAM للكومة.
  • أعزب SELECT أداء:يفوز الفهرس المتفاوت بحوالي 16% بسبب البحث الثاني المطلوب للكومة.
  • يتراوح SELECT أداء:يفوز الفهرس المتفاوت بحوالي 29% بسبب الترتيب العشوائي للكومة.
  • منافس INSERT:يفوز جدول الكومة بنسبة 30% تحت التحميل بسبب انقسامات الصفحات للفهرس المجمع.

نصائح أخرى

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

يقوم عامل التشغيل المنطقي والمادي لمسح الفهرس المجمع بمسح الفهرس المجمع المحدد في عمود الوسيطة.عند وجود المسند WHERE:() اختياري، يتم إرجاع الصفوف التي تتوافق مع المسند فقط.إذا كان عمود الوسيطة يحتوي على عبارة ORDERED، فإن معالج الاستعلام قد طلب إرجاع مخرجات الصفوف بالترتيب الذي قام الفهرس المجمع بفرزها به.إذا لم تكن جملة ORDERED موجودة، فسيقوم محرك التخزين بفحص الفهرس بالطريقة المثلى (لا يضمن فرز المخرجات).

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

يقوم عامل التشغيل المنطقي والمادي لمسح الجدول باسترداد كافة الصفوف من الجدول المحدد في عمود الوسيطة.إذا ظهر المسند WHERE:() في عمود الوسيطة، فسيتم إرجاع الصفوف التي تلبي المسند فقط.

يجب أن يقوم فحص الجدول بفحص كل صف من الجدول.يحتاج فحص الفهرس المجمع إلى فحص الفهرس فقط.لا يقوم بمسح كل سجل في الجدول.هذه هي النقطة، حقا، من المؤشرات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top