ИСПРАВЛЕНИЕ: редкая возможность получения неправильных результатов при использовании Option(Recompile) для запросов внутри процедуры в SQL Server 2014 или SQL Server 2012

Применяется к
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Express SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2012 Business Intelligence SQL Server 2012 Analysis Services SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

Проблема

Рассмотрим следующий сценарий.

  • Процедура выполняется в Microsoft SQL Server 2014 или SQL Server 2012.

  • Процедура содержит запрос, который имеет следующие условия:

    • Он присоединяется к таблице, которая очень часто обновляется.
    • В нем есть предложение WHERE, содержащее параметры.
    • Он использует Option(Recompile).
  • Эта процедура выполняется для нескольких одновременных соединений с разными наборами значений параметров.

  • Ваш сервер находится под большой нагрузкой, из-за которой каждая из этих процедур занимает больше времени, чем обычно.

В этом случае процедура, выполняемая в подключении, может привести к неверным результатам, если в течение интервала времени между завершением составления запроса и началом его выполнения в соединении выполняются следующие дополнительные условия:

  • Условие 1: Другое параллельное подключение вносит в присоединенную таблицу достаточно большие изменения, чтобы вызвать еще одну перекомпиляцию запроса для подключения.
  • Условие 2: тот же запрос был перекомпилирован из другого подключения и помещен в кэш.

Важно! Эта проблема с синхронизацией встречается крайне редко.

Причина

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

Решение

Эта проблема была впервые исправлена в следующем накопительном пакете обновления SQL Server.

Накопительный пакет обновления 4 для SQL Server 2014 г. /en-us/help/2999197

Накопительный пакет обновления 2 для SQL Server 2012 с пакетом обновления 2 (SP2) /en-us/help/2983175

Накопительный пакет обновления 11 для SQL Server 2012 с пакетом обновления 1 (SP1) /en-us/help/2975396

Сведения о накопительных обновлениях для SQL Server

Каждый новый накопительный пакет обновления для SQL Server содержит все исправления и исправления безопасности, которые входили в состав предыдущего накопительного пакета обновления. Ознакомьтесь с последними накопительными пакетами обновления для SQL Server:

      

Состояние

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