FIX: 重新排列非選擇性的聯結和外部聯結之前的篩選準則的外部聯結

文章翻譯 文章翻譯
文章編號: 318530 - 檢視此文章適用的產品。
Bug #: 356418 (SHILOH_BUGS)
全部展開 | 全部摺疊

在此頁中

徵狀

如果您送出查詢,其中包含至少一個外部結合,具有篩選條件在 WHERE 子句的外部聯結 (比方說篩選條件左外部聯結的右邊的資料表 (或右外部聯結的左邊的資料表),在內部資料表中 SQL Server 可能執行較不選擇性的聯結第一次代替提早執行外部聯結,並套用篩選條件。如果從外部聯結篩選條件是其中一個查詢更具選擇性的準則,失敗初期計劃中處理程序之條件可能會導致:
  • 較大的中繼聯結大小。
  • 較高的資源利用率,SQL Server 所處理。
  • 查詢的的回應時間較慢。

解決方案

SQL Server 2005 的解析度

如果要解決這個問題,取得最新的 Service Pack 的 SQL Server 2005。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
913089如何取得最新的 Service Pack,SQL Server 2005 的
安裝 SQL Server 2005 Service Pack 之後您必須開啟追蹤旗標 4101 如果要解決這個問題。

SQL Server 2000 的解析度

如果要解決這個問題,取得最新的 Service Pack,Microsoft SQL Server 2000。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
290211如何取得最新的 SQL Server 2000 Service Pack
注意: Microsoft SQL Server 2000 Service Pack 3 發行之前建立的下列 Hotfix。

此修正程式的英文版應該具有下列檔案屬性或更新版本:
   Version       File name
   -----------------------------

   8.00.0584     Sqlservr.exe
				
注意: 由於檔案相依性最新版 Hotfix 或包含檔案的功能可能也包含其他檔案。

狀況說明

SQL Server 2005 的狀態

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。
這個問題,首先已經在 Microsoft SQL Server 2005 Service Pack 1 中獲得修正。

SQL Server 2000 的狀態

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。
這個問題,首先已經在 Microsoft SQL Server 2000 Service Pack 3 中獲得修正。

其他相關資訊

下列 contrived 的聯結案例使用 pubs 資料庫來示範案例:
set ansi_nulls off
go

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 要套用之後外部聯結子句條件。輸出顯示原始、 較慢的查詢計劃其中所有內部聯結會先執行,而外部聯結及篩選器會執行最後,即使是最選擇性條件的查詢。第二個查詢計劃是強制的計劃示範更快的計劃的外觀,在其中的外部聯結及篩選器會先執行,後面接著其餘的內部聯結。

針對此特定案例,最佳化器會繼續套用 Hotfix 之後,即使選擇第一個計劃。這是因為這些表格是過小而估計的成本的第一個計劃很低被視為比處繼續搜尋後續的替代方案,只是執行與該計劃會更好。資料表中的資料增加時,第一個計劃的成本變得更高,並且最佳化器開始選擇第二個計劃。

屬性

文章編號: 318530 - 上次校閱: 2008年2月4日 - 版次: 5.1
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
關鍵字:?
kbmt kbhotfixserver kbqfe kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix KB318530 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:318530
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com