#sql #performance #tsql
#sql #Производительность #tsql
Вопрос:
Я видел вопросы, довольно похожие на этот, но они не совсем охватывают то, что я хочу. Допустим, у нас есть таблица, полная данных о хранилищах:
Stores
(
Store int,
Address string,
... (20 columns of data),
,PRIMARY KEY CLUSTERED (Store)
)
Теперь предположим, что в этой таблице сотни миллионов строк. Я хочу, чтобы информация о 100 из этих хранилищ была распределена по всей таблице. У меня есть другая таблица с этими 100 хранилищами:
MyStores
(
Store int,
PRIMARY KEY CLUSTERED (Store)
)
Я хочу знать разницу в производительности между этими двумя операторами:
SELECT a.*
FROM Stores a
JOIN MyStores b
ON a.Store = b.Store
против.
SELECT *
FROM Stores
WHERE Store IN (12, 34, 56, ..., 99999)
-- 100 stores in this list
Здесь не используется динамический SQL, и у меня уже есть таблица MyStores, поэтому не нужно беспокоиться о времени настройки. Просто хочу сравнить фактические скорости обработки и / или планы запросов для двух приведенных выше инструкций. Я бы подумал, что второе, естественно, будет быстрее, но если список очень длинный, мне интересно, получится ли в итоге медленнее. Есть мысли? Бонусные баллы за ссылки на ответы!
Кроме того, если вы считаете, что ответ меняется, когда мы объединяем больше таблиц (для других столбцов), по сравнению с добавлением большего количества списков IN с помощью AND, тогда не стесняйтесь расширять анализ.
Ответ №1:
Ответ на ваш вопрос заключается в том, что вам нужно попробовать это: ваши данные, ваша система.
В общем, я бы ожидал, что эти два будут иметь сопоставимую производительность выполнения. Для фиксированного списка SQL Server должен выполнять поиск по индексу.
Оптимизатор должен быть достаточно умен, чтобы проделать то же самое со вторичной таблицей.
Конечно, по мере увеличения «списка» SQL Server балансирует накладные расходы на перенаправление через индекс, чтобы просто прочитать таблицу и сравнить значения. Таким образом, производительность и планы всегда должны проверяться.