SQL Server / المتوسط / الدرس 9
الفهارس والإحصاءات وخطط التنفيذ
اربط شرط الاستعلام بمسارات الوصول المادية، واقرأ أدلة الخطة واختر فهارس مركزة وميّز أخطاء التقدير من العمل المكلف المناسب.
في هذه الصفحة
أهداف الدرس
- شرح الفهارس العنقودية وغير العنقودية.
- تمييز شرط مجال يدعم البحث.
- مقارنة التقديرات والصفوف الفعلية والقراءات المنطقية.
افهم ما يخزنه الفهرس
ينظم الفهرس العنقودي للصفوف بيانات أوراق الجدول وفق مفتاحه. ويحافظ غير العنقودي على بنية مرتبة أخرى بمفاتيح ومحدد موقع الصف. للجدول فهرس عنقودي واحد على الأكثر وقد يكون له عدة فهارس غير عنقودية. ينشئ المفتاح الأساسي عادة فهرساً فريداً داعماً؛ لكن الهوية المنطقية والتنظيم المادي خياران مرتبطان وليسا مترادفين.
يشغل كل فهرس مساحة ويضيف عملاً إلى الإدراج والحذف والتحديثات ذات الصلة. قد يبطئ تحسين القراءة نظاماً كثيف الكتابة. اختر مفاتيح ضيقة مستقرة وبرر كل فهرس بأنماط استعلام فعلية. الكومة جدول دون فهرس عنقودي، وليست فاسدة أو بطيئة دائماً. قيّم العمل بدلاً من تطبيق قالب موحد.
اجعل شروط البحث قابلة للاستفادة
يمكن للشرط القابل للبحث توفير مفاتيح بحث مفيدة للفهرس. يكون مجال مباشر على CreatedAt عادة أنسب من تطبيق YEAR(CreatedAt) على كل صف. لا يضمن ذلك بحثاً؛ فقد يختار المحسّن مسحاً مناسباً عندما تتأهل صفوف كثيرة. تهم أنواع المعلمات المتوافقة أيضاً لأن التحويل الضمني على العمود المفهرس قد يضعف الوصول أو التقدير.
يعبر الشرطان عن يناير 2026 بطريقتين. يحفظ المجال نصف المفتوح جميع دقة الوقت ويكشف مجال مفاتيح متصلاً. تحقق من الأثر بالخطة بدلاً من منع كل دالة منعاً مطلقاً. وفهرس العمود المحسوب تصميم مختلف قد يدعم تعبيراً أحياناً، لكنه يحتاج مراجعة متطلباته وكلفة صيانته.
-- Predicate comparison only; assumes a lab OrderHeader table.
SELECT OrderId FROM dbo.OrderHeader
WHERE YEAR(CreatedAt)=2026 AND MONTH(CreatedAt)=1;
SELECT OrderId FROM dbo.OrderHeader
WHERE CreatedAt>='20260101' AND CreatedAt<'20260201';
يستهدف كلاهما يناير للأوقات غير NULL، ويكشف الثاني مجالاً مباشراً؛ ولا نفترض خطة أو زمناً مختلقاً.
صمّم فهرساً مركباً مركزاً
قد يدعم فهرس يبدأ بـ CustomerId ثم CreatedAt مساواة العميل يليها مجال التاريخ. تحمل INCLUDE أعمدة غير مفتاحية مطلوبة في النتيجة دون إضافتها إلى مفتاح البحث. يتبع الترتيب المناسب الشروط والفرز والانتقائية والاستعلامات الأخرى. عبارة الإنشاء التصورية اقتراح تصميم لا توجيه لإضافة فهرس دون تحليل.
قد تمنع تغطية الاستعلام عمليات بحث متكررة عن الصفوف، لكن تضمين كل عمود يوسع الفهرس ويزيد كلفته. افحص الفهارس القائمة للتداخل وكلفة الكتابة قبل إضافة غيرها. يصف اقتراح الفهرس المفقود فرصة تحسين واحدة ويغفل مفاضلات التصميم الأوسع. هو دليل للتقييم لا ترحيل معتمد تلقائياً.
-- Design illustration for a disposable lab schema.
CREATE INDEX IX_OrderHeader_Customer_Created
ON dbo.OrderHeader(CustomerId,CreatedAt)
INCLUDE (OrderId,Amount);
الفائدة المتوقعة تقليل الصفحات أو البحث الإضافي لاستعلامات مناسبة؛ وتحتاج الفائدة الفعلية خططاً وقياساً ممثلين.
اقرأ التقديرات بجانب حقائق التنفيذ
تشرح الخطة المقدرة استراتيجية مقترحة دون تشغيل الاستعلام. وتتطلب الخطة الفعلية التنفيذ وتضم حقائق وقت التشغيل. لا تطلب خطة فعلية لتعديل غير آمن على قاعدة حية لمجرد الفحص. قارن الصفوف المقدرة والفعلية واختيارات الربط والشروط المتبقية وانسكاب الفرز أو التجزئة وعمليات البحث المتكررة بالمفتاح.
تصف الإحصاءات توزيعات يستخدمها تقدير العدد؛ وقد تساهم إحصاءات قديمة أو غير ممثلة في خيارات ضعيفة. الفرق الكبير دليل لا إثبات أن تحديث جميع الإحصاءات هو الحل. قارن قيم المعلمات وارتباط الشروط وتفاوت البيانات. نسب كلفة المؤثرات تقديرات نموذجية وليست ساعة تقيس الزمن المنقضي.
قس المفاضلة كاملة
في بيئة مؤقتة ممثلة، قارن القراءات المنطقية بـ SET STATISTICS IO ومقاييس المعالج والزمن بـ SET STATISTICS TIME مع الخطط الفعلية. كرر بقدر يميز الضوضاء وأثر الذاكرة المخبأة ووثّق الظروف. تعلم متغيرات الجداول الصغيرة المعنى لكنها لا تثبت انتقائية الإنتاج أو قيمة الفهرس. لا تفرغ ذاكرة الخطط أو الصفحات المشتركة من أجل درس.
تحقق من تطابق النتائج قبل مقارنة السرعة، ثم ضم كلفة الإدراج والتحديث وحجم الفهرس والتزامن وتكرار الاستعلام. قد يكون توفير عشر ميلي ثوانٍ في تقرير نادر أسوأ من تراجع بسيط في كل كتابة طلب. احتفظ بترحيل قابل للعكس ومعيار نجاح صريح لأي تحسين فعلي.
الأخطاء الشائعة وإصلاحها
A seek still reads many rows.
- لماذا يحدث؟
- مجال البحث واسع أو يرفض شرط متبقٍ مرشحين كثيرين.
- كيف تصلحه؟
- افحص الصفوف المقروءة والناتجة وترتيب المفاتيح.
- كيف تتجنب تكراره؟
- قس العمل لا اسم المؤثر.
Writes slowed after indexing.
- لماذا يحدث؟
- أصبحت التعديلات تصون بُنى إضافية.
- كيف تصلحه؟
- أزل التداخل غير المبرر بعد مراجعة العمل.
- كيف تتجنب تكراره؟
- احسب كلفة الكتابة والتخزين قبل إضافة الفهارس.
Plan percentages disagree with elapsed time.
- لماذا يحدث؟
- فُهمت نسب الكلفة المقدرة كأزمنة فعلية.
- كيف تصلحه؟
- استخدم مقاييس التنفيذ والانتظار مع الخطة.
- كيف تتجنب تكراره؟
- ميّز الأدلة المقدرة من المرصودة.
اختبر فهمك
1. يرشح الاستعلام CustomerId بالمساواة وCreatedAt بمجال. اقترح ترتيب مفاتيح.
اعرض الحل المشروح
CustomerId ثم CreatedAt بداية معقولة لأن المساواة تختار مجال العميل قبل التاريخ. تحقق من الفرز والفهارس والانتقائية وكلفة الكتابة؛ وليس الاختيار مثالياً تلقائياً.
2. تعرض الخطة 100 صف مقدر و100000 فعلي. ماذا تفحص؟
اعرض الحل المشروح
افحص تفاوت المعلمات والإحصاءات وارتباط الشروط والتحويلات، واربط الخطأ بخيارات الربط والذاكرة. لا تفرض فهرساً لمجرد خطأ التقدير.
أهم ما تعلمته
- تصميم الفهرس مفاضلة بين القراءة والكتابة.
- ليس البحث أرخص تلقائياً من المسح.
- تتطلب الخطط الفعلية تنفيذاً يجب أن يكون آمناً.