سؤال

وطلب مني زميل العمل للنظر في الفهرسة على بعض الجداول لاستعلام له كان يعمل لفترة طويلة جدا. أكثر من ساعة.

select count(1)
from databaseA.dbo.table1
inner join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

ملاحظة قواعد البيانات المختلفة. وتدار هذه من DatabaseB

وكانت

الجدولين 1 و 2 أكثر من 2 مليون سجلات طويلة. كان Table3 من عشرة سجلات أو نحو ذلك.

ونظرت إلى خطة الاستعلام وقرر محسن للقيام يسعى مؤشر المتداخلة حلقة في الجدولين 1 و 2 مع Table3 كما في الجدول القيادة!

كان

وقائي الاول افتراض أن الأحصائيات افسدت على محمل الجد حتى على Tables1 و 2 ولكن قبل إحصاءات تحديث حاولت إضافة الانضمام تلميح هكذا:

select count(1)
from databaseA.dbo.table1
inner HASH join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

والنتائج التي تم إرجاعها خلال 15 ثانية.

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

هل يجب إعادة النظر في مسألة الإحصاءات وحل المشكلة بهذه الطريقة؟ كادت تؤدي خطة الاستعلام سيئة من الانضمام يجري من قواعد بيانات منفصلة؟

ويمكن لأي شخص تقدم لي بعض الأفكار القائمة على تجربتك؟

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

المحلول

وأنا أشك في الإحصاءات أولا.

وكما تعلمون بلا شك، تاريخ وينبغي تجنب تلميحات في 99٪ من الحالات، ويستخدم فقط عندما يكون لديك دليل على أن يطلب منهم تماما.

نصائح أخرى

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

ولن حلقة متداخلة تكون أكثر مناسبة؟ خذ السجلات 12 من الجدول 3، مباراة إلى 12 السجلات في الجدول 1، مباراة إلى 12 السجلات في الجدول 2.

وعلى خلاف ذلك، تجزئة انضمام الخاص من شأنه فرض الأمر كذلك - وهذا يعني أنك تريد تجزئة 1000000 السجلات من الجدول 1 والجدول 2، ثم الانضمام إلى 12 السجلات في الجدول 3

وأود أن ننظر في إحصاءات لكل من خطط - وكنت أظن أن حلقة الانضمام هو في الواقع أكثر كفاءة، ولكن تم حجب أو التجزئة الخاصة بك انضمام والاستفادة من البيانات المخزنة مؤقتا

.

ولكن - نعم - بشكل عام، والانضمام تلميحات هي الملاذ الأخير

واستعلام تشغيل بطيئة تنطوي على ملقمات المرتبطة قد تضطر الى القيام به مع الترتيب. انظر هنا لبعض الخلفية: <لأ href = "http://blogs.msdn.com/psssql/archive/2008/02/14/how-it-works-linked-servers-and-collation-compatibility.aspx" يختلط = "نوفولو noreferrer"> http://blogs.msdn.com/psssql/archive/2008/02/14/how-it-works-linked-servers-and-collation-compatibility.aspx تجزئة الانضمام تلميح يجبر الترتيب، بحيث يفسر كسب الأداء.

إليك كيفية تعيين خيارات:

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'collation compatible', 
    @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'use remote collation', 
    @optvalue=N'false'

و-Edoode

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