لماذا لا يضمن SQL Server فرز النتائج دون ترتيب حسب

مرحبا مجددا. في شهر حزيران (يونيو) ، أطلقت OTUS مرة أخرى دورة "MS SQL Server Developer" ، بشكل تقليدي عشية بدء الدورة ، نبدأ في مشاركة المواد حول الموضوع معك.




إذا كان استعلامك لا يحتوي على ORDER BY ، فلا يمكنك التأكد من أن ترتيب النتائج لن يتغير بمرور الوقت.

بالطبع ، في البداية سيكون كل شيء متوقعًا إلى حد كبير ، ولكن مع حدوث التغييرات (في الفهارس والجداول وتكوين الخادم وكمية بياناتك) ، قد تواجه بعض المفاجآت غير السارة.

لنبدأ بشيء بسيط: قم بتحديد SELECT لجدول Users من قاعدة بيانات Stack Overflow. يحتوي هذا الجدول على فهرس كتلة لعمود المعرف ، والذي يبدأ من واحد ويزيد إلى تريليون. بالنسبة لهذا الاستعلام ، يتم إرجاع البيانات بترتيب الفهرس المتجمع:



ولكن إذا قمت بإنشاء فهرس على DisplayName والموقع ، فحينئذٍ يقرر SQL Server فجأة استخدام فهرس جديد ، وليس فهرس مجمع:



إليك خطة التنفيذ:



لماذا قرر SQL Server استخدام هذا الفهرس ، على الرغم من أنه لا يحتاج إلى الفرز بواسطة DisplayName والموقع؟ لأن هذا الفهرس هو أصغر نسخة من البيانات التي يجب الحصول عليها. دعونا نلقي نظرة على حجم المؤشرات مع sp_BlitzIndex:



يحتوي المؤشر المجمع (CX / PK) على حوالي 8.9 مليون صف وحجمه 1.1 غيغابايت .

في الفهرس غير العنقودي لـ DisplayName ، يبلغ الموقع أيضًا حوالي 8.9 مليون صف ، ولكن حجمه هو 368 ميجا بايت فقط . إذا كنت بحاجة إلى إجراء مسح ضوئي للحصول على نتائج الاستعلام ، فلماذا لا تختار أصغر مصدر بيانات ، لأنه سيكون أسرع. ولهذا السبب قام SQL Server بذلك.

"نعم ، ولكن طلبي يحتوي على WHERE."


حسنًا ، الآن لدينا فهرس DisplayName والموقع ، دعنا نجرب استعلامًا يبحث عن اسم معين (DisplayName). يتم فرز النتائج حسب DisplayName:



تُظهر خطة التنفيذ استخدام الفهرس بواسطة DisplayName والموقع:



ولكن إذا نظرت إلى قيمة مختلفة ، فلن يتم فرز النتائج بعد ذلك بواسطة DisplayName:



وجد SQL Server أن Alex لديه فهرس مجمع أكثر معقولية المسح الضوئي بدلاً من البحث عن الفهرس + مفتاح البحث:



حتى في هذه الحالات البسيطة حقًا ، لا يمكنك ضمان استخدام SQL Server دائمًا لنسخة البيانات التي تتوقعها.

في الآونة الأخيرة ، صادفت حالات أكثر تعقيدًا:

  • إزالة الفهرس المستخدم في الاستعلام
  • (Forced Parameterization), , SQL Server
  • (Compatibility Level) (Cardinality Estimator), .



.



All Articles