Корпорация Майкрософт распространяет исправления Microsoft SQL Server 2008 R2 как один файл для загрузки. Поскольку исправления являются кумулятивными, каждый новый выпуск содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2.
Проблемы
Рассмотрим следующий сценарий.
-
Приложение выполняет запрос, который ссылается на некоторые временные таблицы в Microsoft SQL Server 2008 и Microsoft SQL Server 2008 R2. Временные таблицы создаются в сеансе, а не в хранимой процедуре.
-
План запроса кэшируется.
-
Многие пользователи выполняют один и тот же запрос в среде с высокой степенью параллельности. Например, многие пользователи используют приложение, которое выполняет следующий запрос:
create table #x (col1 int) go insert into #x values (1) go select * from #x where col1 = 1 go
В этом сценарии приложение встречает проблемы с производительностью.Примечание. Дополнительные сведения о том, как идентифицировать эту ошибку, можно найти в разделе "Дополнительные сведения".
Причина
Эта проблема возникает из-за того, что один и тот же план запроса вставляется в кэш в один и тот же сегмент хэша для каждого пользователя, если текст запроса одинаков. Когда большое количество планов хэшируется в один и тот же сегмент (также называемый хэш-цепью), время поиска плана в кэше значительно возрастает, и могут возникать проблемы с производительностью. Кроме того, рабочие потоки могут столкнуться с серьезным состязанием, а другие потоки оказывают влияние на то, что эти рабочие потоки не выполняют правильные выдачи планировщика.
Решение
Примечание. В настоящее время доступна только обновление для SQL Server 2008 R2. Чтобы устранить эту проблему, ознакомьтесь с разделом временное решение для SQL Server 2008.
Сведения о накопительном пакете обновления
SQL Server 2008 R2 с пакетом обновления 1 (SP1)
Исправление для этой проблемы впервые выпущено в накопительном обновлении 1 для SQL Server 2008 R2 с пакетом обновления 1 (SP1). Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2544793 Накопительный пакет обновления 1 для SQL Server 2008 R2 с пакетом обновления 1 (SP1)Примечание. Поскольку сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2567616 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2 с пакетом обновления 1 (SP1)
SQL Server 2008 R2
Исправление для этой проблемы впервые выпущено в накопительном обновлении 7. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления для SQL Server 2008 R2, щелкните следующий номер статьи базы знаний Майкрософт:
2507770 Накопительный пакет обновления 7 для SQL Server 2008 R2 Примечание. Поскольку сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
981356 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".
Обходное решение
Для решения этой проблемы в SQL Server 2008 и SQL Server 2008 R2 переместите все ссылки на временные таблицы в хранимых процедурах.
Дополнительная информация
Дополнительные сведения о том, как создавать и изменять основы работы с таблицами, можно найти на веб-сайте MSDN по следующему адресу:
Создание и изменение основ работы с таблицамиКонфликты спин-блокировок можно идентифицировать из динамического административного представления sys.dm_os_spinlock_stats (DMV) с высокой интенсивностью конфликтов на объект SOS_CACHESTOREной взаимоблокировки. Чтобы определить этот вопрос, выполните запрос, подобный приведенному ниже.
select cp.bucketid, count(cp.bucketid) as BucketCount, st.text from sys.dm_exec_cached_plans cp cross apply sys.dm_exec_sql_text(cp.plan_handle) as st group by cp.bucketid, st.text having count(cp.bucketid) >1 order by BucketCount descЕсли при выполнении этого запроса выполняются указанные ниже условия, могут возникнуть проблемы с производительностью.
-
Этот запрос создает тот же текст запроса.
-
Количество для того же bucketid является большим.Примечание. Большое количество для одного и того же bucketid обычно составляет более 1000.
-
Запросы ссылаются на временные таблицы