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

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

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

Симптомы

При работе с 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.

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

Параметры запуска службы ядра СУБД

Сфера применения

  • SQL Server 2005–SQL Server 2019