كم مرة يجب إعادة بناء الفهارس في قاعدة بيانات SQL Server الخاصة بنا؟

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

سؤال

حاليًا يبلغ حجم قاعدة البيانات لدينا 10 جيجابايت وتنمو بحوالي 3 جيجابايت شهريًا. غالبًا ما أسمع أنه يجب على المرء من وقت لآخر إعادة بناء الفهارس ، لتحسين وقت تنفيذ الاستعلام. إذن كم مرة يجب أن أعيد بناء الفهارس في السيناريو المعطى؟

هل كانت مفيدة؟

المحلول

هناك إجماع عام على أنه يجب عليك إعادة تنظيم ("إزالة الجدل") مؤشراتك بمجرد أن تصل تجزئة الفهرس إلى أكثر من 5 (في بعض الأحيان 10 ٪) ، ويجب عليك إعادة بناءها تمامًا عندما تتجاوز 30 ٪ (على الأقل هذه هي الأرقام التي أقوم بها " سمعت في الكثير من الأماكن).

ميشيل أوفورد (المعروف أيضًا باسم "SQL Fool") لديه البرنامج النصي الآلي فهرس, والتي تستخدم تلك الحدود الدقيقة لتحديد وقت إعادة تنظيم أو إعادة بناء فهرس.

انظر أيضا نصائح براد ماكجي حول فهارس إعادة البناء مع بعض الأفكار والنصائح الجيدة حول كيفية التعامل مع إعادة بناء الفهرس.


أستخدم هذا البرنامج النصي هنا (لا أستطيع أن أتذكر عندما حصلت على هذا من - أيا كان: جزيل الشكر! أشياء مفيدة حقًا) لعرض تفتيت الفهرس على جميع مؤشراتك في قاعدة بيانات معينة:

SELECT 
    t.NAME 'Table name',
    i.NAME 'Index name',
    ips.index_type_desc,
    ips.alloc_unit_type_desc,
    ips.index_depth,
    ips.index_level,
    ips.avg_fragmentation_in_percent,
    ips.fragment_count,
    ips.avg_fragment_size_in_pages,
    ips.page_count,
    ips.avg_page_space_used_in_percent,
    ips.record_count,
    ips.ghost_record_count,
    ips.Version_ghost_record_count,
    ips.min_record_size_in_bytes,
    ips.max_record_size_in_bytes,
    ips.avg_record_size_in_bytes,
    ips.forwarded_record_count
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN  
    sys.tables t ON ips.OBJECT_ID = t.Object_ID
INNER JOIN  
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id
WHERE
    AVG_FRAGMENTATION_IN_PERCENT > 0.0
ORDER BY
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count

نصائح أخرى

"عندما تحتاج إلى" و "عندما تستطيع"!

علي سبيل المثال...

  • اختبار التجزئة أولاً وقرر ما إذا كان لا يجب فعل أي شيء ، أو إعادة البناء أو إعادة البناء.نص SQL Fool يفعل هذا, ، على سبيل المثال ، لديه @minFragmentation و @rebuildThreshold المعلمات

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

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

ستحتاج إلى استخدام dbcc showcontig([Table]) للتحقق من مستوى تجزئة الفهارس ، حدد عدد المرات التي يتم فيها تجزئة ومستوى التجزئة بالفعل.

يستخدم dbcc dbreindex([Table]) لإعادة بناء الفهارس تمامًا عندما تصبح مجزأة للغاية (أعلى من 20 ٪ -30 ٪ أو نحو ذلك) ولكن إذا لم تتمكن dbcc indexdefrag([Database], [Table], [Index]) لتحمل الفهرس في fassion "عبر الإنترنت". ضع في اعتبارك أيضًا أنه يمكنك إيقاف تشغيل تشغيل الفهرس وبدء تشغيله مرة أخرى في وقت لاحق دون أن تفقد أي عمل.

إن الاحتفاظ بقاعدة بيانات وفهارسها "في تناغم" يتطلب القليل من المراقبة للتعرف على متى وماذا تكرس.

بالنظر إلى حجم قاعدة البيانات الخاصة بك ، يمكنك بسهولة إعادة بناء الفهارس مرة واحدة في الشهر. ولكن مع زيادة الحجم ، قل لحوالي 500 جيجابايت ، يمكنك القيام بذلك مرتين في الشهر.

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