您目前已離線,請等候您的網際網路重新連線

不支援您的瀏覽器

您必須更新瀏覽器,才能使用此網站。

更新至最新版本的 Internet Explorer

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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本: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 offgouse pubsgocreate procedure dbo.ansi_nulls_param @P1 varchar(11) asselect 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_idwhere ta.title_id = @P1goexec dbo.ansi_nulls_param '123-45-6789'godrop proc dbo.ansi_nulls_paramgo--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 - 最後檢閱時間:02/04/2008 17:13:56 - 修訂: 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
意見反應