تصحيح: إعادة ترتيب صلات خارجية مع معايير التصفية قبل الصلات غير انتقائية والصلات الخارجية

الخطأ رقم: 356418 (SHILOH_BUGS)

الأعراض

إذا قمت بإرسال استعلام يتضمن صلة خارجية واحد على الأقل يحتوي على شرط عامل تصفية في جملة where على الطاولة الداخلية من صلة خارجية (على سبيل المثال، شرط تصفية في جدول صلة خارجية يسري أو الجدول الأيسر من صلة خارجية يمنى)، SQL Server قد تنفيذ الصلات أقل انتقائية أولاً بدلاً من تنفيذ الصلة الخارجية مبكرا وتطبيق شرط عامل التصفية. إذا شرط عامل التصفية من الصلة الخارجية أحد معايير أكثر انتقائية للاستعلام، قد يؤدي الفشل في معالجة المعايير مبكرا في الخطة إلى:
  • الأحجام المتوسطة صلة أكبر.
  • استخدام الموارد أعلى بعملية SQL Server.
  • وقت الاستجابة البطيئة للاستعلام.

الحل

القرار ل SQL Server 2005

لحل هذه المشكلة، يجب الحصول على أحدث حزمة خدمة ل SQL Server 2005. لمزيد من المعلومات، انقر فوق رقم المقالة التالية لعرضها في "قاعدة معارف Microsoft":
كيفية الحصول على أحدث حزمة خدمة ل SQL Server 2005 913089
بعد تثبيت حزمة خدمة SQL Server 2005، يجب تشغيل إشارة تتبع 4101 لحل هذه المشكلة.

القرار ل SQL Server 2000

Microsoft SQL Server 2000لحل هذه المشكلة، يجب الحصول على أحدث حزمة خدمة ل لمزيد من المعلومات، انقر فوق رقم المقالة التالية لعرضها في "قاعدة معارف Microsoft":
كيفية الحصول على أحدث حزمة خدمة ل SQL Server 2000 290211
ملاحظة: تم إنشاء الإصلاح العاجل التالي قبل إصدار Microsoft SQL Server 2000 Service Pack 3.

يجب أن يكون إصدار اللغة الإنجليزية من هذا الإصلاح سمات الملفات التالية أو أحدث
   Version       File name
-----------------------------

8.00.0584 Sqlservr.exe

ملاحظة: بسبب تبعيات الملف، أحدث إصلاح عاجل أو الميزة التي تحتوي على الملفات قد تحتوي أيضا على ملفات إضافية.

الحالة

حالة ل SQL Server 2005

أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في قسم "ينطبق على".
تم تصحيح هذه المشكلة أولاً في Microsoft SQL Server 2005 Service Pack 1.

حالة ل SQL Server 2000

أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في قسم "ينطبق على".
تم تصحيح هذه المشكلة أولاً في Microsoft SQL Server 2000 Service Pack 3.

مزيد من المعلومات

السيناريو الصلة مختلقة التالي يستخدم قاعدة بيانات pubs لتوضيح السيناريو:
set ansi_nulls offgo

use pubs
go

create procedure dbo.ansi_nulls_param @P1 varchar(11) as
select t.title_id, a.au_id, ta.title_id, s.stor_id from titles t
left outer join titleauthor ta on ta.title_id = t.title_id
inner join authors a on a.au_id = t.title_id
inner join sales s on s.title_id = t.title_id
where ta.title_id = @P1
go

exec dbo.ansi_nulls_param '123-45-6789'
go

drop proc dbo.ansi_nulls_param
go

--Slower Query Plan:
|--Filter(WHERE:([ta].[title_id]=[@P1]))
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([t].[title_id]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([s].[title_id]))
| |--Nested Loops(Inner Join, OUTER REFERENCES:([s].[title_id]))
| | |--Index Scan(OBJECT:([pubs].[dbo].[sales].[titleidind] AS [s]))
| | |--Clustered Index Seek(OBJECT:([pubs].[dbo].[authors].[UPKCL_auidind] AS [a]), SEEK:([a].[au_id]=[s].[title_id]) ORDERED FORWARD)
| |--Clustered Index Seek(OBJECT:([pubs].[dbo].[titles].[UPKCL_titleidind] AS [t]), SEEK:([t].[title_id]=[s].[title_id]) ORDERED FORWARD)
|--Index Seek(OBJECT:([pubs].[dbo].[titleauthor].[titleidind] AS [ta]), SEEK:([ta].[title_id]=[t].[title_id]) ORDERED FORWARD)

--Faster Query Plan:
|--Nested Loops(Inner Join, OUTER REFERENCES:([a].[au_id]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([t].[title_id]))
| |--Filter(WHERE:([ta].[title_id]=[@P1]))
| | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([t].[title_id]))
| | |--Index Scan(OBJECT:([pubs].[dbo].[titles].[titleind] AS [t]))
| | |--Index Seek(OBJECT:([pubs].[dbo].[titleauthor].[titleidind] AS [ta]), SEEK:([ta].[title_id]=[t].[title_id]) ORDERED FORWARD)
| |--Clustered Index Seek(OBJECT:([pubs].[dbo].[authors].[UPKCL_auidind] AS [a]), SEEK:([a].[au_id]=[t].[title_id]) ORDERED FORWARD)
|--Index Seek(OBJECT:([pubs].[dbo].[sales].[titleidind] AS [s]), SEEK:([s].[title_id]=[a].[au_id]) ORDERED FORWARD)

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

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

رقم الموضوع: 318530 - آخر مراجعة: 19‏/01‏/2017 - المراجعة: 1

تعليقات