FIX: 的 DML 作業所引發觸發程序的效能可能會降低時觸發程序的執行計劃 recompiles 重複

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

按一下這裡查看此文章的英文版本:870972
本文已封存。本文係以「現狀」提供且不會再更新。
Bug #: 470083 (SQL Server 8.0)
結論
本文將告訴您下列關於此 Hotfix 版本:
  • 此 Hotfix 套件所修正之問題。
  • 安裝 Hotfix 套件的先決條件。
  • 是否您必須重新啟動您的電腦安裝 Hotfix 套件之後。
  • 是否 Hotfix 套件會取代任何其他 Hotfix 套件。
  • 您必須在是否做任何登錄變更。
  • Hotfix 套件中所包含的檔案。
back to the top
徵狀
您在執行資料操作語言 (DML) 陳述式如 UPDATE 時 INSERT,。 DELETE 陳述式所引發觸發程序、 觸發程序執行計劃要增進效能的觸發程序執行 Microsoft SQL Server 程式重新編譯然而,觸發程序執行計劃的重複重新編譯可能會降低觸發程序執行效能。

當下列情況成立時,可能就會發生的觸發程序的執行計劃重複的重新編譯:
  • 多次執行 DML 陳述式。
  • DML 陳述式所影響的資料列數目不同 DML 陳述式執行每一次。
如需清單前一個快速補充程式請參閱 「 Microsoft SQL Server 2000 post-Service 封包 3 或 Microsoft SQL 伺服器 2000 post-Service 封包 3a Hotfix 」 一節,下列 「 Microsoft 知識庫 」 文件中:
290211如何取得最新的 SQL Server 2000 Service Pack
back to the top
解決方案

服務套件資訊

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

Hotfix 資訊

必要條件

此 Hotfix 需要 Microsoft SQL Server 2000 Service Pack 3 (SP3)。 如需有關如何取得 SQL Server 2000 Service Pack 3 的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
290211如何取得最新的 SQL Server 2000 Service Pack
back to the top

重新啟動資訊

您沒有套用此 Hotfix 之後,重新啟動您的電腦。

附註套用此 Hotfix 之後,您必須重新啟動您電腦執行的 SQL Server 2000 程式。

back to the top

Hotfix 檔案資訊

此 Hotfix 包含只需修正本文所列問題的那些檔案。此 Hotfix 並未包含必須將產品完整更新至最新版組建的所有檔案。

此 Hotfix 的英文版在檔案屬性 (或更新版本的檔案屬性) 如下列表格中所列。 這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用 [中日期] 和 [時間] 工具,在 [控制台] 中的 [時區] 索引標籤]。
    Date         Time   Version       Size       File name   ------------------------------------------------------------------   18-Jun-2004  14:14  2000.80.954.0    664,128  Autoplt.dll         18-Jun-2004  14:14  2000.80.954.0     78,400  Console.exe         18-Jun-2004  14:14  2000.80.954.0    315,968  Custtask.dll        18-Jun-2004  14:14  2000.80.954.0     33,340  Dbmslpcn.dll        08-Apr-2004  09:12                   786,432  Distmdl.ldf   08-Apr-2004  09:12                 2,359,296  Distmdl.mdf   10-Oct-2003  06:18                       180  Drop_repl_hotfix.sql   18-Jun-2004  14:14  2000.80.954.0  1,905,216  Dtspkg.dll          18-Jun-2004  14:14  2000.80.954.0    528,960  Dtspump.dll         18-Jun-2004  14:14  2000.80.954.0  1,557,052  Dtsui.dll           18-Jun-2004  14:14  2000.80.954.0    639,552  Dtswiz.dll          10-Oct-2003  06:18                   747,927  Instdist.sql   10-Oct-2003  06:18                     1,581  Inst_repl_hotfix.sql   18-Jun-2004  14:14  2000.80.954.0    352,828  Isqlw.exe           18-Jun-2004  14:14  2000.80.954.0     82,492  Itwiz.exe           18-Jun-2004  14:14  2000.80.954.0     90,692  Msgprox.dll         19-May-2004  11:13  8.11.40209.0     209,408  Mssdi98.dll         18-Jun-2004  14:14  2000.80.954.0     62,024  Odsole70.dll        18-Jun-2004  14:15  2000.80.954.0     25,144  Opends60.dll        18-Jun-2004  14:14  2000.80.954.0     57,904  Osql.exe            18-Jun-2004  14:14  2000.80.954.0    279,104  Pfutil80.dll        10-Oct-2003  06:07                   550,780  Procsyst.sql   08-Apr-2004  09:12                    12,305  Qfe469315.sql   08-Apr-2004  09:12                    19,195  Qfe469571.sql   17-Jun-2004  02:42                 1,105,167  Replmerg.sql   18-Jun-2004  14:14  2000.80.954.0    221,768  Replprov.dll        18-Jun-2004  14:14  2000.80.954.0    307,784  Replrec.dll         16-Jun-2004  14:07  2000.80.954.0    159,813  Replres.rll   10-Oct-2003  06:18                 1,087,150  Replsys.sql   10-Oct-2003  06:18                   986,603  Repltran.sql   18-Jun-2004  14:14  2000.80.954.0    287,304  Rinitcom.dll        18-Jun-2004  14:14  2000.80.954.0     78,416  Sdiclnt.dll         18-Jun-2004  14:14  2000.80.954.0     66,112  Semmap.dll          18-Jun-2004  14:14  2000.80.954.0     57,916  Semnt.dll           18-Jun-2004  14:14  2000.80.954.0    492,096  Semobj.dll          16-Jun-2004  14:44  2000.80.954.0    172,032  Semobj.rll   18-Jun-2004  14:14  2000.80.954.0     53,832  Snapshot.exe        11-Mar-2004  14:40                   117,834  Sp3_serv_uni.sql   18-Jun-2004  14:13  2000.80.954.0     28,672  Sqlagent.dll        18-Jun-2004  14:14  2000.80.954.0    311,872  Sqlagent.exe        18-Jun-2004  14:13  2000.80.954.0    168,001  Sqlakw32.dll        18-Jun-2004  14:14  2000.80.954.0     33,344  Sqlctr80.dll        18-Jun-2004  14:14  2000.80.954.0  4,215,360  Sqldmo.dll          18-Jun-2004  14:14                    25,172  Sqldumper.exe       16-Jun-2004  13:54  2000.80.954.0     28,672  Sqlevn70.rll   18-Jun-2004  14:14  2000.80.954.0    180,792  Sqlmap70.dll        18-Jun-2004  14:14  2000.80.954.0    188,992  Sqlmmc.dll          16-Jun-2004  14:52  2000.80.954.0    479,232  Sqlmmc.rll   18-Jun-2004  14:14  2000.80.954.0    401,984  Sqlqry.dll          18-Jun-2004  14:14  2000.80.954.0     57,920  Sqlrepss.dll        18-Jun-2004  14:14  2000.80.954.0  7,581,777  Sqlservr.exe        18-Jun-2004  14:14  2000.80.954.0    590,396  Sqlsort.dll         18-Jun-2004  14:14  2000.80.954.0     45,644  Sqlvdi.dll          18-Jun-2004  14:14  2000.80.954.0    106,588  Sqsrvres.dll        18-Jun-2004  14:14  2000.80.954.0     33,340  Ssmslpcn.dll        18-Jun-2004  14:14  2000.80.954.0     82,492  Ssnetlib.dll        18-Jun-2004  14:14  2000.80.954.0     25,148  Ssnmpn70.dll        18-Jun-2004  14:14  2000.80.954.0    123,456  Stardds.dll         18-Jun-2004  14:14  2000.80.954.0    158,240  Svrnetcn.dll        18-Jun-2004  14:14  2000.80.954.0     76,416  Svrnetcn.exe        18-Jun-2004  14:14  2000.80.954.0     49,228  Ums.dll             18-Jun-2004  14:14  2000.80.954.0     98,872  Xpweb70.dll      
附註由於檔案相依性的最新 Hotfix 包含這些檔案也可能包含其他檔案。back to the top
狀況說明
Microsoft 已確認這是在 Microsoft 中的錯誤 < 適用於 > 一節中所列出的產品。

這個問題,首先已經在 Microsoft SQL Server 2000 服務套件 4 中獲得修正。

back to the top
其他相關資訊
這個 Hotfix 更新改善了執行計劃的觸發程序重新編譯的臨界值。才會生效的 [臨界值改進您必須啟用 SQL Server 追蹤旗標 9055 安裝此 Hotfix 之後。若要啟用追蹤旗標 9055 的 SQL Server 執行個體,使用下列方法之一:
  • 在 SQL 查詢中執行下列的 Transact-SQL 陳述式的 SQL Server 執行個體上的分析:
    DBCC TRACEON (9055, -1)
  • 新增 -T9055 至 SQL Server 啟動參數。

重現這個問題的步驟

如果要重現會導致觸發程序執行計劃重新編譯的分析藍本,請依照下列步驟執行:
  1. 啟動 SQL 查詢分析器,然後連線至 SQL Server 2000 的執行個體。
  2. 在資料表上建立一個資料表和更新觸發程序。命名與 cache_test 資料表,並命名為 cache_test_update 更新觸發程序。若要執行此動作執行下列的 Transact-SQL 陳述式:
    use pubsgoset nocount ongoif exists (select 1 from sysobjects where id = object_id('dbo.cache_test'))drop table dbo.cache_testgocreate table dbo.cache_test(id int not null,descr varchar(30) not null,rowcreateddt datetime not null default getdate(),rowcreatedby varchar(30) not null default right(system_user,30),testcolumn varchar(30) null,primary key (id))gocreate trigger dbo.cache_test_updateon dbo.cache_testfor updateasif exists ( select 1 from inserted where id = 98654 )print 'test'returngo
  3. cache_test] 資料表中插入某些記錄,然後再從程序快取中移除所有項目。To do this, run the following Transact-SQL statements:
    insert into cache_test (id, descr, testcolumn) select 1,'Descr 1','Test 1'insert into cache_test (id, descr, testcolumn) select 2,'Descr 2','Test 2'insert into cache_test (id, descr, testcolumn) select 3,'Descr 3','Test 3'insert into cache_test (id, descr, testcolumn) select 4,'Descr 4','Test 4'insert into cache_test (id, descr, testcolumn) select 5,'Descr 5','Test 5'insert into cache_test (id, descr, testcolumn) select 6,'Descr 6','Test 6'insert into cache_test (id, descr, testcolumn) select 7,'Descr 7','Test 7'insert into cache_test (id, descr, testcolumn) select 8,'Descr 8','Test 8'insert into cache_test (id, descr, testcolumn) select 9,'Descr 9','Test 9'insert into cache_test (id, descr, testcolumn) select 10,'Descr 10','Test 10'godbcc freeproccache
  4. 更新資料表 cache_test 中的單一資料列,然後看看這個快取中的單一資料列更新計劃。若要執行此動作執行下列的 Transact-SQL 陳述式:
    update cache_testset testcolumn = 'testing '+cast(id as varchar)where id between 1 and 1goselect SetOpts,UseCounts,* from master..SyscacheObjects where ObjId=Object_ID('cache_test_update') order by SetOpts, CacheObjTypego
    您注意到類似下列的輸出:
    SetOpts UseCounts bucketid cacheobjtype     objtype  objid      dbid dbidexec uid refcounts usecounts pagesused lasttime maxexectime avgexectime lastreads lastwrites setopts langid dateformat status sqlbytes sql5371	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update5371	1	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    1	      1	        0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update
  5. 更新 cache_test] 資料表中的四個資料列,然後看看這個快取中的多個資料列更新計劃。若要執行此動作執行下列的 Transact-SQL 陳述式:
    update cache_testset testcolumn = 'testing '+cast(id as varchar)where id between 1 and 4goselect SetOpts,UseCounts,* from master..SyscacheObjects where ObjId=Object_ID('cache_test_update') order by SetOpts, CacheObjTypego
    您會注意到類似下列的輸出:
    SetOpts UseCounts bucketid cacheobjtype     objtype  objid      dbid dbidexec uid refcounts usecounts pagesused lasttime maxexectime avgexectime lastreads lastwrites setopts langid dateformat status sqlbytes sql4347	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update4347	1	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    1	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update5371	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update5371	1	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    1	      1 	0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update
  6. 更新五個資料列) 在 cache_test 資料表以及然後,請參閱此多重資料列更新計劃,是快取中。若要執行此動作執行下列的 Transact-SQL 陳述式:
    update cache_testset testcolumn = 'testing '+cast(id as varchar)where id between 1 and 5goselect SetOpts,UseCounts,* from master..SyscacheObjects where ObjId=Object_ID('cache_test_update') order by SetOpts, CacheObjTypego
    您注意到類似下列的輸出:
    SetOpts UseCounts bucketid cacheobjtype     objtype  objid      dbid dbidexec uid refcounts usecounts pagesused lasttime maxexectime avgexectime lastreads lastwrites setopts langid dateformat status sqlbytes sql4347	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update4347	2	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    2	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update

    如果您將相比較在步驟 5 中輸出與這個輸出可能會注意到下列可能會導致觸發程序執行效能的降低的情況:
    • 對應至多個資料列更新步驟 5 的輸出中的執行計劃會被刪除。若要建立新的執行計劃重新編譯執行計劃,其對應到多個更新的資料列,就會發生這個問題。
    • 即使執行計劃出現被重新編譯,usecounts 資料行表示可執行檔計劃已被使用兩次。這不是正確。
    • 此外,對應至單一資料列更新的執行計劃已被刪除,從快取。
back to the top
参考
如需詳細資訊請造訪下列 Microsoft 開發人員網路 (MSDN) 網站]:取得更多資訊有關 Microsoft SQL Server 更新命名的結構描述按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
822499Microsoft SQL Server 軟體更新套件的新命名結構描述
如 Microsoft 時修正軟體,它發行之後所使用的術語的額外有關,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
824684用來描述 Microsoft 軟體更新標準術語的說明
如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
263889SQL 封鎖,因為 [[COMPILE]] 會鎖定
back to the top
觸發程序的執行計劃重新編譯多個資料列更新

警告:本文為自動翻譯

內容

文章識別碼:870972 - 最後檢閱時間:01/17/2015 08:43:49 - 修訂: 2.4

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 kbtrigger kbbug kbfix kbsqlserv2000presp4fix kbhotfixserver kbqfe KB870972 KbMtzh
意見反應