SQL Server خطة تنفيذ الاستعلام يظهر الخطأ "الفعلية عدد الصفوف" على استخدام مؤشر الأداء الرهيب بطيئة

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

سؤال

اليوم أنا تعثرت على أداء مثيرة للاهتمام مشكلة مع الإجراء المخزن يعمل على Sql Server 2005 المزود بحزمة الخدمة SP2 في db تعمل على متوافق مستوى 80 (SQL2000).

بروك يمتد حوالي 8 دقائق و تنفيذ خطة يظهر استخدام مؤشر فعلي الصف العد 1.339.241.423 وهي عبارة عن 1000 عامل أعلى من "ريال مدريد" الفعلية rowcount الطاولة نفسها التي 1.144.640 كما هو موضح بشكل صحيح من خلال يقدر عدد الصفوف.لذا الفعلية عدد الصفوف التي قدمها خطة الاستعلام محسن هو بالتأكيد خطأ!

alt text

ومن المثير للاهتمام بما فيه الكفاية ، عندما نسخ procs قيم المعلمة داخل مجلد إلى المتغيرات المحلية من استخدام المتغيرات المحلية في الاستعلام الفعلي, كل شيء يعمل بشكل جيد - بروك يعمل 18 ثانية و تنفيذ خطة يظهر الحق الفعلية عدد الصفوف.

تحرير: كما اقترح TrickyNixon ، يبدو أن علامة المعلمة استنشاق المشكلة.ولكن في الحقيقة أنا تحصل في كل الحالات بالضبط نفس خطة التنفيذ.نفس المؤشرات بيينغ تستخدم في نفس الترتيب.الفرق الوحيد الذي أراه هو الطريق إلى ارتفاع الفعلية الصف الاعتماد على PK_ED_Transitions مؤشر عندما مباشرة باستخدام parametervalues.

لقد فعلت dbreindex dbcc وتحديث الإحصاءات بالفعل دون أي نجاح.dbcc show_statistics يظهر بيانات مؤشر أيضا.

بروك يتم إنشاؤه مع ترجمة لذلك في كل مرة يتم تشغيله خطة تنفيذ جديدة هو الحصول على ترجمة.

أن تكون أكثر تحديدا - هذا واحد يعمل بسرعة:

CREATE  Proc [dbo].[myProc](
@Param datetime
)
WITH RECOMPILE 
as

set nocount on

declare @local datetime
set @local = @Param

select 
some columns
from 
table1
where
column = @local
group by
some other columns

و هذا الإصدار يعمل بشكل رهيب بطيئة, ولكن تنتج بالضبط نفس خطة التنفيذ (إلى جانب عالي جدا الفعلية الصف الاعتماد على استخدام مؤشر):

CREATE  Proc [dbo].[myProc](
@Param datetime
)
WITH RECOMPILE 
as

set nocount on

select 
some columns
from 
table1
where
column = @Param
group by
some other columns

أي أفكار ؟ أي شخص يعرف أين Sql Server يحصل الصف الفعلي قيمة عدد من عند حساب الاستعلام الخطط ؟

التحديث:حاولت الاستعلام عن ملقم آخر woth copat وضع مجموعة إلى 90 (Sql2005).لها نفس السلوك.أعتقد أنني سوف تفتح ms دعم الدعوة ، لأن هذا يبدو لي علة.

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

المحلول

حسنا, أخيرا حصلت على ذلك بنفسي.

اثنين من خطط الاستعلام تختلف في التفاصيل الصغيرة التي فاتتني في البداية.بطء واحد يستخدم حلقات متداخلة مشغل للانضمام اثنين من الاستعلامات الفرعية معا.وينجم عن ذلك ارتفاع عدد في الصف الحالي الاعتماد على مؤشر مسح المشغل الذي هو ببساطة نتيجة multiplicating عدد الصفوف من إدخال مع عدد من الصفوف من المدخلات ب.

ما زلت لا أعرف لماذا محسن تقرر استخدام حلقات متداخلة بدلا من تجزئة المباراة التي تدير 1000 توقيت أسرع في هذه الحالة, ولكن أنا لا يمكن التعامل مع هذه المشكلة عن طريق إنشاء فهرس جديد, بحيث أن المحرك لا فهرس تسعى statt بدلا من مسح مؤشر إطار حلقات متداخلة.

نصائح أخرى

عندما كنت التحقق من تنفيذ خطط تخزين بروك ضد نسخ/لصق الاستعلام هل تستخدم المقدرة خطط أو الفعلية الخطط ؟ تأكد من انقر فوق استعلام ، وتشمل خطة التنفيذ ثم قم بتشغيل كل استعلام.قارن تلك الخطط الاختلافات.

يبدو أن قضية المعلمة استنشاق.هنا شرح ممتاز جنبا إلى جنب مع الحلول الممكنة: أنا رائحة معلمة!

هنا آخر ستاكوفيرفلوو موضوع يتناول ذلك: المعلمة استنشاق (أو خداع) في SQL Server

لي فإنه لا يزال يبدو كما لو أن الإحصاءات غير صحيحة.إعادة إنشاء الفهارس ليس بالضرورة تحديثها.

هل حاولت بالفعل صريح UPDATE STATISTICS المتضررة الجداول ؟

هل تشغيل sp_spaceused للتحقق مما إذا كان SQL Server لديه الحق في موجز هذا الجدول ؟ أعتقد في SQL server 2000 المحرك المستخدم إلى استخدام هذا النوع من البيانات الوصفية عند بناء خطط التنفيذ.كنا تشغيل DBCC UPDATEUSAGE الأسبوعي لتحديث البيانات الوصفية على بعض بسرعة تغيير الجداول ، SQL Server تم اختيار مؤشرات الخطأ بسبب غير صحيحة عدد صفوف البيانات.

كنت تقوم بتشغيل SQL 2005 و بول يقول أنه في عام 2005 يجب أن لا يكون لديك لتشغيل UpdateUsage بعد الآن, ولكن بما أنك في عام 2000 compat الوضعية قد تجد أنه لا يزال مطلوبا.

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