يحتاج الجدول الضخم في قاعدة بيانات SQL 2005 إلى أداء أفضل!

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

سؤال

أنا أعمل على تطبيق ويب مدفوع البيانات يستخدم قاعدة بيانات SQL 2005 (إصدار قياسي).

أحد الطاولات كبيرة نوعا كبيرا (8 ملايين + صفوف كبيرة مع حوالي 30 أعمدة). من الواضح أن حجم الجدول يؤثر على أداء موقع الويب الذي يختار عناصر من الجدول من خلال procs المخزنة. يتم فهرسة الجدول ولكنه لا يزال الأداء ضعيفا بسبب كمية الصفوف الهائلة في الجدول - هذا جزء من المشكلة - الجدول قراءة بنفس القدر كحديث، لذلك لا يمكننا إضافة / إزالة الفهارس دون إجراء واحد من العمليات أسوأ.

الهدف الذي لدي هنا هو زيادة الأداء عند اختيار العناصر من الجدول. يحتوي الجدول على بيانات "الحالية" والبيانات القديمة / بالكاد لمست. الحل الأكثر فعالية يمكننا أن نفكر في هذه المرحلة هو فصل الجدول إلى 2، أي واحد بالنسبة للبنود القديمة (قبل تاريخ معين، يقول 1 يناير 2005) وواحد للحصول على بنود أحدث (يساوي أو قبل 1 يناير 2005) وبعد

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

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

المحلول

يمكنك دائما تقويم "تقسيم / DPV المسكين" الخاص بك، حتى لو لم يكن رائحة مثل الطريقة الصحيحة للقيام بذلك. هذا هو مجرد نهج مفاهيمي واسع:

  1. قم بإنشاء جدول جديد لبيانات العام الحالي - نفس الهيكل، نفس الفهارس. اضبط الإجراء المخزن الذي يكتب إلى الطاولة الرئيسية الكبيرة للكتابة إلى كلا الجدولين (مؤقتا). أوصي بإجراء المنطق في الإجراء المخزن يقول إذا كان Current_timestamp> = '[تاريخ كامل دون مرور الوقت] "- سيجعل ذلك من السهل إرجاء البيانات في هذا الجدول الذي يعود مسبقا التغيير إلى الإجراء الذي يبدأ تشغيل التسجيل هناك.

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

  3. بمجرد أن تتمتع بنسخة من الجدول بأكمله، يمكنك إنشاء طرق عرض تشير إلى أن السنة الحالية فقط، عرض آخر مفاده أنه يشير إلى عام 2005 للسنة الحالية (باستخدام Union All بين الجدول الحالي وتلك الموجودة في قاعدة البيانات الأخرى التالية> = 2005 )، وآخر يشير إلى مجموعات الثلاثة من الجداول (تلك المذكورة، والجداول التي ما قبل تاريخ 2005). بالطبع يمكنك كسر هذا الأمر أكثر ولكن أردت فقط الحفاظ على الحد الأدنى من المفهوم.

  4. قم بتغيير الإجراءات المخزنة التي تقرأ البيانات لتكون "أكثر ذكاء" - إذا كان نطاق التاريخ يسقط داخل السنة التقويمية الحالية، استخدم أصغر طريقة عرض مخصصة فقط؛ إذا كان نطاق التاريخ> = 2005، فاستخدم العرض الثاني، استخدم العرض الثالث. يمكنك متابعة منطقي مماثلة مع الإجراءات المخزنة التي تكتب، إذا كنت تفعل أكثر من مجرد إدراج بيانات جديدة ذات صلة فقط بالسنة الحالية.

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

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

نصائح أخرى

الأداء ضعيف بسبب كمية الصفوف الهائلة في الطاولة

8 مليون صف لا يبدو كل ذلك مجنون. هل تحققت خطط الاستعلام الخاصة بك؟

الجدول كما هو قراءة على النحو المحدث

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

(ولا، رمي الأجهزة في الأمر لن يحدث أيضا)

هذا مؤسف لأن ذاكرة الوصول العشوائي رخيصة الأوساخ.

إعادة بناء جميع الفهارس الخاصة بك. هذا سوف يعزز أداء الاستعلامات. كيف تفعل ذلك هذه وعنا أكبر من التأثير على إعادة بناء الفهرس المتراكب وغير المتراكب هنا

ثانيا أداء إلغاء التجزئة على محرك الأقراص الخاص بك يتم تخزين DB.

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