FIX: 有些查詢具有左外部聯結和安裝 SQL Server 2000 SP3 張貼 Hotfix 之後,執行速度慢的 IS NULL 篩選器

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

按一下這裡查看此文章的英文版本:830887
本文已封存。本文係以「現狀」提供且不會再更新。
Bug #: SHILOH_BUGS (470434)
徵狀
查詢可能對 Microsoft SQL Server 2000 張貼 SP3 Hotfix 組建 8.00.0776 執行速度變慢或稍後相較於查詢對 SQL Server 2000 該執行 Hotfix 組建 8.00.0776 之前,如果下列情況成立:
  • 查詢涉及兩個資料表的左外部聯結。在下列範例資料表 1 是左邊的資料表而表格 2 右邊的資料表。
  • IS NULL 的篩選條件存在於右邊的資料表 (表格 2) 的資料行上。
  • 聯結的資料行有不同的資料型別。一個資料行型別 varchar/字元,其他資料行是型別 nvarchar/nchar
  • 非常少的查詢結果資料列滿足外部聯結的 ON 條件。
比方說包含下列的聯結和篩選條件的查詢可能會執行速度變慢:
t1 left outer join t2 on t1.c1 = t2.c1 where t2.c1 is null --t1.c1 is of type nvarchar and t2.c1 is of type varchar
發生的原因
之所以發生這個問題,是因為 SQL Server 最佳化器 underestimates 聯結後滿足 IS NULL 的篩選條件的資料列數目。
其他可行方案
若要解決這個問題,請確定聯結資料行都屬於相同的資料型別。
解決方案

服務套件資訊

如果要解決這個問題,取得最新的 Service Pack,Microsoft SQL Server 2000。如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
290211如何取得最新的 SQL Server 2000 Service Pack

Hotfix 資訊

此 Hotfix 的英文版具有檔案屬性 (或更新) 中如下表所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用 [中日期] 和 [時間] 工具,在 [控制台] 中的 [時區] 索引標籤]。
   Date         Time   Version            Size    File name   --------------------------------------------------------------------   31-May-2003  16:45  2000.80.818.0      78,400  Console.exe         28-Oct-2003  02:21  2000.80.873.0     315,968  Custtask.dll        02-Oct-2003  18:59  2000.80.867.0      33,340  Dbmslpcn.dll        25-Apr-2003  00:12                    786,432  Distmdl.ldf   25-Apr-2003  00:12                  2,359,296  Distmdl.mdf   29-Jan-2003  23:55                        180  Drop_repl_hotfix.sql   12-Sep-2003  01:26  2000.80.859.0   1,905,216  Dtspkg.dll          26-Aug-2003  18:16  2000.80.854.0     528,960  Dtspump.dll         23-Jun-2003  20:40  2000.80.837.0   1,557,052  Dtsui.dll           23-Jun-2003  20:40  2000.80.837.0     639,552  Dtswiz.dll          24-Apr-2003  00:51                    747,927  Instdist.sql   02-May-2003  23:56                      1,581  Inst_repl_hotfix.sql   08-Feb-2003  04:40  2000.80.765.0      90,692  Msgprox.dll         01-Apr-2003  00:07                      1,873  Odsole.sql   04-Apr-2003  23:46  2000.80.800.0      62,024  Odsole70.dll        07-May-2003  18:41  2000.80.819.0      25,144  Opends60.dll        02-Apr-2003  19:48  2000.80.796.0      57,904  Osql.exe            02-Apr-2003  21:15  2000.80.797.0     279,104  Pfutil80.dll        04-Aug-2003  16:17                    550,780  Procsyst.sql   11-Sep-2003  22:37                     12,305  Qfe469315.sql   22-May-2003  20:57                     19,195  Qfe469571.sql   05-Sep-2003  23:36                  1,090,932  Replmerg.sql   06-Sep-2003  05:18  2000.80.858.0     221,768  Replprov.dll        06-Sep-2003  05:18  2000.80.858.0     307,784  Replrec.dll         05-Sep-2003  22:00                  1,087,150  Replsys.sql   13-Aug-2003  14:28                    986,603  Repltran.sql   21-Oct-2003  22:08  2000.80.871.0      57,916  Semnt.dll           29-Jul-2003  18:13  2000.80.819.0     492,096  Semobj.dll          31-May-2003  16:27  2000.80.818.0     172,032  Semobj.rll   05-Aug-2003  19:06                    127,884  Sp3_serv_uni.sql   31-May-2003  23:01  2000.80.818.0   4,215,360  Sqldmo.dll          07-Apr-2003  15:44                     25,172  Sqldumper.exe       19-Mar-2003  16:20  2000.80.789.0      28,672  Sqlevn70.rll   27-Sep-2003  02:42  2000.80.865.0     180,792  Sqlmap70.dll        03-Sep-2003  00:56  2000.80.857.0     188,992  Sqlmmc.dll          02-Sep-2003  21:03  2000.80.857.0     479,232  Sqlmmc.rll   21-Oct-2003  22:08  2000.80.871.0     401,984  Sqlqry.dll          08-Feb-2003  04:40  2000.80.765.0      57,920  Sqlrepss.dll        28-Oct-2003  02:21  2000.80.873.0   7,606,353  Sqlservr.exe        25-Jul-2003  19:44  2000.80.845.0     590,396  Sqlsort.dll         08-Feb-2003  04:40  2000.80.765.0      45,644  Sqlvdi.dll          02-Oct-2003  18:59  2000.80.867.0      33,340  Ssmslpcn.dll        31-May-2003  23:01  2000.80.818.0      82,492  Ssnetlib.dll        31-May-2003  23:01  2000.80.818.0      25,148  Ssnmpn70.dll        28-Oct-2003  02:21  2000.80.873.0     123,456  Stardds.dll         31-May-2003  23:01  2000.80.818.0     158,240  Svrnetcn.dll        31-May-2003  16:59  2000.80.818.0      76,416  Svrnetcn.exe        30-Apr-2003  21:52  2000.80.816.0      45,132  Ums.dll             01-Jul-2003  22:19  2000.80.834.0      98,816  Xpweb70.dll      
附註由於檔案相依性最新版 Hotfix 或包含這些檔案的功能也可能包含其他檔案。
狀況說明
Microsoft 已確認這是本文 < 適用於 > 一節中所列的 Microsoft 產品中的問題。

這個問題,首先已經在 Microsoft SQL Server 2000 服務套件 4 中獲得修正。
其他相關資訊
本文中安裝所述的 Hotfix 之後,您必須確定啟動 SQL Server 時,亮 9209 該追蹤旗標。此修正,才會生效,您必須有追蹤旗標 9209 啟動 SQL Server 時開啟]。如果要執行這項操作,請依照下列步驟執行:
  1. 啟動 SQL Server 企業管理員。
  2. SQL Server 執行個體上按一下滑鼠右鍵,然後按一下 [內容]。
  3. 按一下 [一般] 索引標籤,然後按一下 [啟動參數
  4. 在 [啟動參數] 對話方塊輸入 -T9209參數] 方塊按一下 [新增],],然後再按一下 [確定]
  5. SQL Server 屬性] 對話方塊中,按一下 [確定]
  6. 重新啟動 SQL Server。

資料型別 (在此情況下,為 nvarchar/nchar 資料行比較 varchar/char 資料行時) 的轉換在查詢中的一個資料行可能必須不良的影響,對查詢的效能和它是個不錯的主意,若要避免這樣做,如果可以的話。如果您使用 [資料型別轉換 SQL Server 可能無法精確地產生基數估計。SQL Server 可能也限制從使用適當的索引。取得更多資訊有關資料型別轉換按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
271566PRB: SQL Server 比較資料行和使用不同資料型別的常數之間

警告:本文為自動翻譯

內容

文章識別碼:830887 - 最後檢閱時間:01/17/2015 05:26:56 - 修訂: 5.3

Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Workgroup Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Enterprise Edition 64-bit

  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug KB830887 KbMtzh
意見反應