KB2526959-FIX: проблема с производительностью приложения, когда запрос обращается к временным таблицам, созданным в сеансе в SQL Server 2008 и SQL Server 2008 R2

Корпорация Майкрософт распространяет исправления 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.

  • Запросы ссылаются на временные таблицы

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×