ИСПРАВЛЕНИЕ: При использовании переменных курсора языка Transact-SQL для выполнения операций, которые имеют большие итерации утечка памяти в SQL Server 2000

Переводы статьи Переводы статьи
Код статьи: 837957 - Vizualiza?i produsele pentru care se aplic? acest articol.
Номер ошибки: 471233 (SQL Server 8.0)


Корпорация Майкрософт распространяет исправления SQL Server 2000 как один загружаемый файл. Так как исправления являются накопительными, каждый выпуск содержит все исправления и все обновления программного обеспечения, которые были включены в Предыдущие обновления программного обеспечения SQL Server 2000.
Развернуть все | Свернуть все

В этой статье

Проблема

Когда Используйте переменные курсоров Transact-SQL для выполнения операций, которые имеют большой итерации, наблюдается следующее поведение:
  • Клиент, выполняющий операции на компьютере, на котором запущен SQL Server может возвращать ошибки нехватки памяти, подобные приведенным ниже:

    Сообщение об ошибке 1

    Msg 701: Недостаточно системной памяти для запуска этой запрос.
    Сообщение об ошибке 2

    Msg 1204: SQL Server невозможно в настоящее время получения ресурса БЛОКИРОВКИ. Повторите инструкцию, когда существует меньше Активные пользователи или обратиться к системному администратору для проверки блокировки SQL Server и Конфигурация памяти.
    Сообщение об ошибке 3

    Msg 17803: Недостаточно памяти.
  • Ответ от компьютера, на котором запущен SQL Server 2000 может оказаться медленнее.
  • Инструкция DBCC FREEPROCCACHE Transact-SQL не может освободить память или не может очистить кэш процедур. Это может происходить, даже если клиент отключается от компьютера, на котором запущен SQL Server.

Причина

Это происходит потому, что они не освобождаются ресурсы, используемые в переменной курсора.

Временное решение

Чтобы обойти эту проблему, необходимо освободить ресурсы, выделенные для переменных курсора. Для этого необходимо проверить следующие:
  • Если переменная курсора с помощью инструкции SET языка Transact-SQL необходимо использовать инструкции Transact-SQL, ОСВОБОДИТЬ освобождение ресурсов, используемых курсор, когда курсор больше не требуется.
  • Если открыть переменная курсора с помощью инструкции Transact-SQL, ОТКРОЙТЕ необходимо использовать оператор ЗАКРЫТЬ Transact-SQL для освобождения ресурсов, используемых курсор, когда курсор больше не требуется.

Решение

Сведения о пакете обновления

Чтобы устранить эту проблему, получите последний пакет обновления для Microsoft SQL Server 2000. Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
290211 Как получить последний пакет обновления для SQL Server 2000

Сведения об исправлении

Английская версия данного исправления содержит версии атрибуты файла (или более поздней версии), приведенные в следующей таблице. В Дата и время для файлов указаны в формате общего скоординированного времени (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      
Примечание Из-за зависимостей между файлами, последнего исправления или функция содержащий эти файлы могут также содержать дополнительные файлы.

Статус

Корпорация Майкрософт подтверждает, что это проблема в продуктах Майкрософт, перечисленных в разделе «Относится к» данной статьи.

Сначала исправление этой проблемы появилось в пакете обновления 4 (Sp4) для SQL Server 2000.

Дополнительная информация

Происходит, поведение, описанное в разделе «Проблема» Когда вы выполняете следующие действия значение переменной курсора, а затем повторно использовать одну и ту же переменную курсора без Освобождает ресурсы, используемые в переменной курсора. Например рассмотрим следующую хранимую процедуру:
CREATE PROCEDURE MYPROC
BEGIN

    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 statements

END

Если выполнить эту хранимую процедуру, появляется сообщение Ошибка нехватки памяти. Чтобы устранить проблему, необходимо изменить код хранимой процедуры следующим образом:
CREATE PROCEDURE MYPROC
BEGIN

    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 SECOND

END

Ссылки

Для получения дополнительных сведений об обновлениях программного обеспечения щелкните следующий номер статьи базы знаний Майкрософт:
824684Описание стандартных термины, используемые при описании обновлений программных продуктов Майкрософт
Для получения дополнительных сведений о памяти связанных задач, щелкните следующие номера статей базы знаний Майкрософт:
810052ИСПРАВЛЕНИЕ: Утечка памяти при открытых курсоров во время подключения
818095 ИСПРАВЛЕНИЕ: Планы курсоров не удаляются из кэша при исчерпании виртуальной памяти
820773 ИСПРАВЛЕНИЕ: Драйвер JDBC утечки серверных курсоров
271624 INF: использование Инструкции DBCC MEMORYSTATUS для мониторинга использования памяти SQL Server

Свойства

Код статьи: 837957 - Последний отзыв: 16 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • 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
Ключевые слова: 
kbhotfixserver kbqfe kbtsql kbsqlprog kbquery kberrmsg kbmemory kbsqlserv2000presp4fix kbfix kbbug kbmt KB837957 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:837957

Отправить отзыв

 

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