Поделиться через


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

Эта статья поможет устранить проблему, из-за которой при выполнении запросов в SQL Server возникает высокая загрузка ЦП.

Применяется к: SQL Server
Исходный номер базы знаний: 2009160

Симптомы

При работе с Microsoft SQL Server с высокой параллельной рабочей нагрузкой могут возникнуть некоторые проблемы с производительностью в запросах. Это поведение может проявляться как среднее к использованию ЦП или запросы на предоставление чрезвычайной памяти.

Вы также можете столкнуться с другими побочными эффектами, такими как условия OOM, давление памяти для вытеснения кэша планов или непредвиденные RESOURCE_SEMAPHORE ожидания.

Кроме того, вы можете заметить, что планы запросов для запросов, потребляющих большое количество ЦП или памяти, имеют атрибут OPTIMIZED для оператора соединения вложенных циклов с значением True.

Причина

Эта проблема может возникать в некоторых случаях, когда обработчик запросов SQL Server вводит необязательную операцию сортировки для повышения производительности. Эта операция называется "Оптимизированный вложенный цикл" или "Сортировка пакетной службы", а оптимизатор запросов определяет, когда лучше всего вводить эти операторы. В редких случаях запрос касается только нескольких строк, но стоимость настройки для операции сортировки настолько значительна, что стоимость оптимизированного вложенного цикла перевешивает свои преимущества. Таким образом, в таких случаях вы можете наблюдать более низкую производительность по сравнению с ожидаемым.

Решение

Флаг трассировки 2340

Чтобы устранить проблему, используйте флаг трассировки 2340, чтобы отключить оптимизацию. Флаг трассировки 2340 указывает обработчику запросов не использовать операцию сортировки (пакетную сортировку) для оптимизированных соединений вложенного цикла при создании плана запроса. Это влияет на весь экземпляр.

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

Дополнительные сведения см. в разделе DBCC TRACEON — флаги трассировки (Transact-SQL).

Изменение кода для использования подсказки DISABLE_OPTIMIZED_NESTED_LOOP

Кроме того, примените следующую DISABLE_OPTIMIZED_NESTED_LOOP подсказку запроса, чтобы отключить оптимизацию на уровне запроса.

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT (DISABLE_OPTIMIZED_NESTED_LOOP)); 

Дополнительные сведения см. в DISABLE_OPTIMIZED_NESTED_LOOP.

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

Параметры запуска службы Database Engine

Применяется к

  • SQL Server 2005–SQL Server 2019