1

Я использую хранимую процедуру, которая проходит через курсор. Внутри курсора я вызываю изначально скомпилированную хранимую процедуру. Исходно скомпилированная хранимая процедура выполняет вставку в таблицу с оптимизацией памяти.«Недостаточно системной памяти в пуле ресурсов» по ​​умолчанию «для запуска этого запроса» во время выполнения хранимой процедуры

Моя проблема в том, что я столкнулся с ошибкой «Недостаточно системной памяти в пуле ресурсов» по ​​умолчанию «запустить этот запрос» через некоторое время (3 минуты или около того).

Я обнаружил проблему, и кажется, что инструкция insert (или ее основной запрос) создает проблему и накачивает память, которая, кажется, не освобождается после вставки, а также не после хранимой процедуры.

Я использую память объемом 3 ГБ (в моей базе данных), в то время как запрос выполняется, шаг за шагом составляет до 12 ГБ (что является пределом) и вызывает ошибку. После ошибки память сразу же опускается до 3 ГБ, что говорит о том, что проблема с самим размером вставки не может быть проблемой. В моей основной хранимой процедуре это около 29 циклов (в курсоре), поэтому сам курсор отлично работает. Если я удалю инструкцию insert (см. Код ниже), все будет отлично. Таким образом, проблема должна заключаться в инструкции insert (соответственно ее базовом запросе). Я не понимаю, почему SQL-сервер, кажется, не освобождает память после вставки (или, по крайней мере, после выполнения собственной хранимой процедуры).

Любые идеи, как решить эту проблему (я использую SQL Server 2014)?

Здесь код изначально скомпилированный хранимой процедуры:

create procedure [CombinedStrategies].[spInsParameterCombinationNative] 
( 
    @UniqueProcessingBlockID int, 
    @MS2ObjectID54RestricationParameterGroupID int, 
    @MS11ObjectID54RestricationParameterGroupID int, 
    @MS15SBBObjectID54RestricationParameterGroupID int, 
    @MS15SBBObjectID59RestricationParameterGroupID int, 
    @MS15SBBObjectID62RestricationParameterGroupID int, 
    @MS15SFObjectID54RestricationParameterGroupID int, 
    @MS15SFObjectID59RestricationParameterGroupID int, 
    @MS15SBObjectID54RestricationParameterGroupID int, 
    @MS15SBObjectID59RestricationParameterGroupID int, 
    @MS15SBObjectID62RestricationParameterGroupID int, 
    @MS16ObjectID54RestricationParameterGroupID int, 
    @MS16ObjectID62RestricationParameterGroupID int, 
    @CombinedParametersMS2 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS11 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS16ObjectID54 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS16ObjectID62 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SBObjectID54 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SBObjectID59 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SBObjectID62 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SBBObjectID54 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SBBObjectID59 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SBBObjectID62 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SFObjectID54 CombinedStrategies.ParameterGroupIDs readonly, 
    @CombinedParametersMS15SFObjectID59 CombinedStrategies.ParameterGroupIDs readonly 
) 
with native_compilation, schemabinding, execute as owner 
as 
begin atomic 
with (transaction isolation level=snapshot, language=N'us_english') 


    -- load parameter combinations into table 

    insert into CombinedStrategies.ParameterCombinationForCursorTemp 
    (
     UniqueProcessingBlockID, 
     MS2ObjectID54ParameterGroupID, 
     MS11ObjectID54ParameterGroupID, 
     MS15SBBObjectID54ParameterGroupID, 
     MS15SBBObjectID59ParameterGroupID, 
     MS15SBBObjectID62ParameterGroupID, 
     MS15SFObjectID54ParameterGroupID, 
     MS15SFObjectID59ParameterGroupID, 
     MS15SBObjectID54ParameterGroupID, 
     MS15SBObjectID59ParameterGroupID, 
     MS15SBObjectID62ParameterGroupID, 
     MS16ObjectID54ParameterGroupID, 
     MS16ObjectID62ParameterGroupID 
    ) 
    select @UniqueProcessingBlockID, 
    MS2_54.ParameterGroupID, 
    MS11_54.ParameterGroupID, 
    MS15_SSB_54.ParameterGroupID, 
    MS15_SSB_59.ParameterGroupID, 
    MS15_SSB_62.ParameterGroupID, 
    MS15_SF_54.ParameterGroupID, 
    MS15_SF_59.ParameterGroupID, 
    MS15_SB_54.ParameterGroupID, 
    MS15_SB_59.ParameterGroupID, 
    MS15_SB_62.ParameterGroupID, 
    MS16_54.ParameterGroupID, 
    MS16_62.ParameterGroupID 
    from @CombinedParametersMS2 as MS2_54, 
    @CombinedParametersMS11 as MS11_54, 
    @CombinedParametersMS15SBBObjectID59 as MS15_SSB_54, 
    @CombinedParametersMS15SBBObjectID59 as MS15_SSB_59, 
    @CombinedParametersMS15SBBObjectID62 as MS15_SSB_62, 
    @CombinedParametersMS15SFObjectID54 as MS15_SF_54, 
    @CombinedParametersMS15SFObjectID59 as MS15_SF_59, 
    @CombinedParametersMS15SBObjectID54 as MS15_SB_54, 
    @CombinedParametersMS15SBObjectID59 as MS15_SB_59, 
    @CombinedParametersMS15SBObjectID62 as MS15_SB_62, 
    @CombinedParametersMS16ObjectID54 as MS16_54, 
    @CombinedParametersMS16ObjectID62 as MS16_62 
    where MS2_54.ParameterGroupID = isnull(@MS2ObjectID54RestricationParameterGroupID, MS2_54.ParameterGroupID) 
    and MS11_54.ParameterGroupID = isnull(@MS11ObjectID54RestricationParameterGroupID, MS11_54.ParameterGroupID) 
    and MS15_SSB_54.ParameterGroupID = isnull(@MS15SBBObjectID54RestricationParameterGroupID, MS15_SSB_54.ParameterGroupID) 
    and MS15_SSB_59.ParameterGroupID = isnull(@MS15SBBObjectID59RestricationParameterGroupID, MS15_SSB_59.ParameterGroupID) 
    and MS15_SSB_62.ParameterGroupID = isnull(@MS15SBBObjectID62RestricationParameterGroupID, MS15_SSB_62.ParameterGroupID) 
    and MS15_SF_54.ParameterGroupID = isnull(@MS15SFObjectID54RestricationParameterGroupID, MS15_SF_54.ParameterGroupID) 
    and MS15_SF_59.ParameterGroupID = isnull(@MS15SFObjectID59RestricationParameterGroupID, MS15_SF_59.ParameterGroupID) 
    and MS15_SB_54.ParameterGroupID = isnull(@MS15SBObjectID54RestricationParameterGroupID, MS15_SB_54.ParameterGroupID) 
    and MS15_SB_59.ParameterGroupID = isnull(@MS15SBObjectID59RestricationParameterGroupID, MS15_SB_59.ParameterGroupID) 
    and MS15_SB_62.ParameterGroupID = isnull(@MS15SBObjectID62RestricationParameterGroupID, MS15_SB_62.ParameterGroupID) 
    and MS16_54.ParameterGroupID = isnull(@MS16ObjectID54RestricationParameterGroupID, MS16_54.ParameterGroupID) 
    and MS16_62.ParameterGroupID = isnull(@MS16ObjectID62RestricationParameterGroupID, MS16_62.ParameterGroupID) 


end 
+1

Можете ли вы переписать это, чтобы исключить курсор в первую очередь? Они ужасно неэффективны и могут привести к очень высокой конкуренции за ресурсы. Вы также должны рассмотреть возможность использования «новых» ANSI-92 стилей. Они доступны уже более 20 лет. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

+0

Я заменил курсор на цикл while, и я сделал некоторый дальнейший анализ (ничего не улучшал). Проблема в том, что запрос. Я заменил вставку простым подсчетом выбора (*), и проблема все еще появляется. Каким-то образом память, используемая для выполнения запроса, впоследствии не освобождается. Далее я сделаю следующий анализ. – Reboon

+2

[СТАТИСТИКА СБРОСА ALTER RESOURCE GOVERNOR] (https://technet.microsoft.com/en-us/library/bb934013 (v = sql.110) .aspx) –

ответ

0

Убедитесь, что максимальная память для SQL Server ограничен таким образом, что есть еще память доступна для операционной системы. Обычно я выделяю 2 ГБ для ОС. Напр. если общая доступная оперативная память составляет 8 ГБ, ограничьте общую память, доступную для SQL Server, - 6 ГБ.

 Смежные вопросы

  • Нет связанных вопросов^_^