SQL Server: выберите производительность в зависимости от значений для подзапроса - PullRequest
0 голосов
/ 10 июня 2019

Рассмотрим 2 запроса, которые должны вернуть все столбцы:

Запрос № 1

select * 
from TA 
where id in (select id from TB where filterColumn = ?) 

Запрос № 2

select * 
from TA 
where id in (?, ?, ? ... n)

TA содержит миллионы записей, а подзапрос по ТБ возвращает 1-2000 записей (но, как правило, всего несколько сотен).

Скажем, результат этих запросов будет 10k записей.

Для 1-го запроса будет выполнено 1 сканирование кластерного индекса для всех записей.

Для 2-го - 10 тыс. Ключевых поисков. Кроме того, если имеется более 2,1 тыс. Параметров - будет несколько запросов (редкий случай).

С точки зрения общей производительности и одновременных операторов вставки / обновления / удаления, какой из запросов предпочтительнее?

1 Ответ

0 голосов
/ 10 июня 2019

и подзапрос по TB возвращает 1-2000 записей

...

С точки зрения общей производительности и одновременных операторов вставки / обновления / удаления, какая иззапросы предпочтительнее ?

Первый подход, потому что:

  1. Анализ тысяч или даже сотен литералов может стоить дополнительных ресурсов оптимизатора запросов.
  2. Планы запросов не будут повторно использоваться при изменении значений IN, поэтому перекомпиляция
  3. Microsoft предупреждает об этом в документации:

Явное включение чрезвычайно большого числа значений (многие тысячи значений, разделенных запятыми) в скобках в предложении IN может потреблять ресурсы и возвращать ошибки 8623 или 8632. Чтобы обойти эту проблему, сохраните элементы в списке IN втаблицы и используйте подзапрос SELECT в предложении IN.

Ошибка 8623:

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

Ошибка 8632:

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

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...