FIX: 當您使用 Transact-SQL 資料指標變數來執行作業有大型的反覆項目時,記憶體遺漏 (Memory Leak) 可能會發生在 SQL Server 2000

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

按一下這裡查看此文章的英文版本:837957
本文已封存。本文係以「現狀」提供且不會再更新。
BUG #: 471233 (SQL Server 8.0)


Microsoft 為一個可下載檔案散佈 SQL Server 2000 的修正程式。因為此修正程式是累積,每個新版本會包含所有 Hotfix 及前一版的 SQL Server 2000 軟體更新隨附的所有軟體更新。
徵狀
使用 Transact-SQL 資料指標變數執行作業有大型的反覆項目時可能會注意到下列行為:
  • 執行正在執行 SQL Server 的電腦上作業的用戶端可能會傳回類似下列的記憶體不足錯誤:

    錯誤訊息 1

    訊息 701: 沒有系統記憶體不足,無法執行此查詢。
    錯誤訊息 2

    訊息 1204年: 的 SQL Server 無法取得鎖定資源這一次。使用中的使用者人數較少時重新執行您的陳述式,或洽詢系統管理員檢查 SQL Server 的鎖定與記憶體組態。
    錯誤訊息 3

    訊息 17803: 可用記憶體不足。
  • 從執行 SQL Server 2000 的電腦回應可能會變得更慢。
  • DBCC FREEPROCCACHE Transact-SQL 陳述式可能不會釋放記憶體,或可能不會清除程序快取。甚至當用戶端與執行 SQL Server 的電腦中斷連線時,可能就會發生這種行為。
發生的原因
不釋放資料指標變數所使用的資源,就會發生這個問題。
其他可行方案
如果要解決這個問題,您必須釋放配置給資料指標變數的資源。如果要執行這項操作,您必須確定下列任一動作:
  • 如果使用 SET Transact-SQL 陳述式設定資料指標變數必須使用解除配置 Transact-SQL 陳述式來釋放資源不再需要資料指標時所使用的資料指標。
  • 如果使用開放 Transact-SQL 陳述式開啟資料指標變數必須使用關閉的 Transact-SQL 陳述式來釋放資源不再需要資料指標時所使用的資料指標。
解決方案

服務套件資訊

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

Hotfix 資訊

此修正程式的英文版具有檔案屬性 (或更新) 中如下表所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。 當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用 [中日期] 和 [時間] 工具,在 [控制台] 中的 [時區] 索引標籤]。
   Date         Time   Version            Size    File name   --------------------------------------------------------------------   31-May-2003  05:15  2000.80.818.0      78,400  Console.exe         27-Oct-2003  14:51  2000.80.873.0     315,968  Custtask.dll        30-Jan-2004  02:59  2000.80.911.0      33,340  Dbmslpcn.dll        24-Apr-2003  12:42                    786,432  Distmdl.ldf   24-Apr-2003  12:42                  2,359,296  Distmdl.mdf   29-Jan-2003  12:25                        180  Drop_repl_hotfix.sql   11-Sep-2003  13:56  2000.80.859.0   1,905,216  Dtspkg.dll          26-Aug-2003  06:46  2000.80.854.0     528,960  Dtspump.dll         23-Jun-2003  09:10  2000.80.837.0   1,557,052  Dtsui.dll           23-Jun-2003  09:10  2000.80.837.0     639,552  Dtswiz.dll          23-Apr-2003  13:21                    747,927  Instdist.sql   02-May-2003  12:26                      1,581  Inst_repl_hotfix.sql   30-Jan-2004  02:59  2000.80.911.0      90,692  Msgprox.dll         31-Mar-2003  12:37                      1,873  Odsole.sql   30-Jan-2004  02:59  2000.80.911.0      62,024  Odsole70.dll        30-Jan-2004  02:59  2000.80.911.0      25,144  Opends60.dll        30-Jan-2004  02:59  2000.80.911.0      57,904  Osql.exe            02-Apr-2003  09:45  2000.80.797.0     279,104  Pfutil80.dll        04-Aug-2003  04:47                    550,780  Procsyst.sql   11-Sep-2003  11:07                     12,305  Qfe469315.sql   22-May-2003  09:27                     19,195  Qfe469571.sql   29-Jan-2004  11:47                  1,090,380  Replmerg.sql   30-Jan-2004  02:59  2000.80.911.0     221,768  Replprov.dll        30-Jan-2004  02:59  2000.80.911.0     307,784  Replrec.dll         29-Jan-2004  09:54  2000.80.911.0     159,813  Replres.rll   05-Sep-2003  10:30                  1,087,150  Replsys.sql   13-Aug-2003  02:58                    986,603  Repltran.sql   30-Jan-2004  02:59  2000.80.911.0     287,304  Rinitcom.dll        30-Jan-2004  02:59  2000.80.911.0      57,916  Semnt.dll           29-Jul-2003  06:43  2000.80.819.0     492,096  Semobj.dll          31-May-2003  04:57  2000.80.818.0     172,032  Semobj.rll   02-Jan-2004  06:12  2000.80.904.0      53,832  Snapshot.exe        09-Dec-2003  06:37                    117,834  Sp3_serv_uni.sql   04-Feb-2004  11:16  2000.80.913.0      28,672  Sqlagent.dll        04-Feb-2004  11:17  2000.80.913.0     311,872  Sqlagent.exe        19-Feb-2004  04:32  2000.80.916.0     168,001  Sqlakw32.dll        30-Jan-2004  02:59  2000.80.911.0   4,215,360  Sqldmo.dll          07-Apr-2003  04:14                     25,172  Sqldumper.exe       29-Jan-2004  09:47  2000.80.911.0      28,672  Sqlevn70.rll   30-Jan-2004  02:59  2000.80.911.0     180,792  Sqlmap70.dll        02-Sep-2003  13:26  2000.80.857.0     188,992  Sqlmmc.dll          02-Sep-2003  09:33  2000.80.857.0     479,232  Sqlmmc.rll   21-Oct-2003  10:38  2000.80.871.0     401,984  Sqlqry.dll          30-Jan-2004  02:59  2000.80.911.0      57,920  Sqlrepss.dll        01-Mar-2004  10:33  2000.80.919.0   7,618,641  Sqlservr.exe        30-Jan-2004  02:59  2000.80.911.0     590,396  Sqlsort.dll         30-Jan-2004  02:59  2000.80.911.0      45,644  Sqlvdi.dll          30-Jan-2004  02:59  2000.80.911.0     106,588  Sqsrvres.dll        30-Jan-2004  02:59  2000.80.911.0      33,340  Ssmslpcn.dll        30-Jan-2004  02:59  2000.80.911.0      82,492  Ssnetlib.dll        30-Jan-2004  02:59  2000.80.911.0      25,148  Ssnmpn70.dll        27-Oct-2003  14:51  2000.80.873.0     123,456  Stardds.dll         30-Jan-2004  02:59  2000.80.911.0     158,240  Svrnetcn.dll        30-Jan-2004  02:59  2000.80.911.0      76,416  Svrnetcn.exe        30-Apr-2003  10:22  2000.80.816.0      45,132  Ums.dll             30-Jan-2004  02:59  2000.80.911.0      98,872  Xpweb70.dll      
注意 由於檔案相依性、 最新 Hotfix 或包含這些檔案的功能的可能也包含其他檔案。
狀況說明
Microsoft 已確認這是本文 < 適用於 > 一節中所列的 Microsoft 產品中的問題。

這個問題,首先已經在 Microsoft SQL Server 2000 服務套件 4 中獲得修正。
其他相關資訊
當您設定資料指標變數,然後重複使用相同的資料指標變數不需要釋放資料指標變數所使用的資源時,就會發生 < 徵狀 > 一節所述問題。 例如,請考慮下列的預存程序:
CREATE PROCEDURE MYPROCBEGIN    DECLARE @CURSOR CURSOR    SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS     -- FIRST ASSIGNMENT (THIS ASSIGNMENT LEAKS WHEN A SECOND ASSIGNMENT TAKES PLACE WITHOUT DEALLOCATION)        --Other Transact-SQL statements        SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS    --  SECOND ASSIGNMENT        --Other Transact-SQL statementsEND

如果您在執行此預存程序可能會收到記憶體不足錯誤訊息。若要解決這個問題,您必須修改預存程序程式碼,如下所示:
CREATE PROCEDURE MYPROCBEGIN    DECLARE @CURSOR CURSOR    SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS     -- FIRST ASSIGNMENT    --Other Transact-SQL statements    DEALLOCATE @CURSOR --DEALLOCATING THE CURSOR VARIABLE BEFORE A SECOND ASSIGNMENT    SET @CURSOR = CURSOR FOR SELECT * FROM AUTHORS    --  SECOND ASSIGNMENT    --Other Transact-SQL statements    DEALLOCATE @CURSOR --DEALLOCATING THE CURSOR VARIABLE THAT WAS ASSIGNED SECONDEND
参考
如需有關軟體更新的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
824684用來描述 Microsoft 軟體更新標準術語的說明
如記憶體的其他有關相關的問題,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
810052FIX: A 記憶體遺漏會發生於資料指標開啟連線期間
818095FIX: 資料指標計劃是不從快取中移除時的虛擬記憶體用盡
820773FIX: JDBC 驅動程式遺漏伺服端資料指標
271624INF: 監視 SQL Server 記憶體使用量,使用 DBCC MEMORYSTATUS

警告:本文為自動翻譯

內容

文章識別碼:837957 - 最後檢閱時間:12/08/2015 06:32:34 - 修訂: 3.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 kbtsql kbsqlprog kbquery kberrmsg kbmemory kbsqlserv2000presp4fix kbfix kbbug KB837957 KbMtzh
意見反應