it-swarm.asia

كيف يمكنني معرفة سبب بطء إدراج على جدول معين؟

أعلم أن إدراج INSERT على جدول SQL يمكن أن يكون بطيئًا لأي عدد من الأسباب:

  • وجود INSERT TRIGGERs على الطاولة
  • الكثير من القيود المفروضة التي يجب التحقق منها (عادة المفاتيح الأجنبية)
  • يتم تقسيم الصفحة في الفهرس العنقودي عند إدراج صف في منتصف الجدول
  • تحديث كافة الفهارس غير المجمعة ذات الصلة
  • المنع من أنشطة أخرى على الطاولة
  • ضعيف IO وقت استجابة الكتابة
  • ... أي شيء فاتني؟

كيف يمكنني معرفة المسؤول عن حالتي الخاصة؟ كيف يمكنني قياس تأثير تجزئة الصفحات مقابل تحديثات الفهرس غير المجمعة مقابل كل شيء آخر؟

لدي proc المخزنة التي تُدرج حوالي 10000 صف في المرة الواحدة (من جدول مؤقت) ، والذي يستغرق حوالي 90 ثانية لكل 10 آلاف صف. هذا بطيء بشكل غير مقبول ، لأنه يؤدي إلى انقضاء مهلة spids الأخرى.

لقد ألقيت نظرة على خطة التنفيذ ، وأرى مهمة INSERT CLUSTERED INDEX وجميع عمليات البحث عن INDEX من عمليات بحث FK ، لكنها لا تخبرني على وجه اليقين لماذا تستغرق وقتًا طويلاً. لا توجد مشغلات ، ولكن يحتوي الجدول على عدد قليل من مفاتيح FKey (التي يبدو أنها مفهرسة بشكل صحيح).

هذه قاعدة بيانات SQL 2000.

30
BradC

بعض الأشياء التي يمكنك النظر إليها ...

قم بتقليل حجم الدفعة من 10000 إلى شيء أصغر ، مثل 2000 أو 1000 (لم تذكر حجم صفك).

حاول تشغيل IO Stats لمعرفة مقدار IO عمليات بحث FK.

ما سبب الانتظار عند حدوث الإدخال (master.dbo.sysprocesses)؟

لنبدأ هنا ونرى أين نذهب.

10
mrdenny

براد ،

يجب عليك فحص احصائيات الانتظار للاستعلام الخاص بك. باستخدام SQL 2000 ، يمكنك استخدام بناء جملة DBCC SQLPERF ("إحصائيات الانتظار") للحصول على هذه التفاصيل.

7
SQLRockstar

يمكنني أن أقول ما أبحث عنه عند تحليل أداء الاستعلام. ربما يساعد.

  • تحليل خطة تنفيذ الاستعلام والتحقق من عمليات مسح الفهرس ومسح الجدول واستخدام الدالات convert_implicit لأنواع بيانات sql والتوازي.
  • قم بتشغيل الاستعلام باستخدام SET STATISTICS IO ON و SET STATISTICS TIME ON لمشاهدة وقت التنفيذ وقراءة/كتابة io لكل إدراج.
  • تحقق من وقت الانتظار من sysprocesses ل spid جلسة العمل الخاصة بك.
  • تشغيل ملف التعريف وتحديد القالب القياسي. حدد ما يلي: إحصائيات الأداء (في حالة التكرار ، يتم تجميع خطتك عدة مرات - ليست جيدة) ، RPC: مكتمل ، SQL: batchcompleted و SQL: batchstarting. أضف إليها العمود عدد الصفوف لترى بالضبط عدد الصفوف في الدفعة. تصفية النتائج لرؤية استفسارك فقط.
  • أخيرًا اجمع Page Life Expectancy عداد من Windows perfmon وإذا كان أقل من 300 (5 دقائق) ، فإن ذاكرة SQL منخفضة. اجمع أيضًا عدادات القرص: طول قائمة انتظار القرص ، وقت القرص (محرك ملفات البيانات) ، وقت القرص (محرك ملفات السجل) لمعرفة ما إذا كان هناك ضغط على الأقراص.
6
yrushka

جرب استخدام:

SET STATISTICS IO ON

و

SET STATISTICS PROFILE ON

إحصائيات IO

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

لمحة احصائية

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

5
Andrew Bickerton