Коллега работает в компании, использующей Microsoft SQL Server. Их команда создает хранимые процедуры, которые выполняются ежедневно для создания извлечений данных. Базовые таблицы огромны (некоторые содержат миллиарды строк), поэтому большинство хранимых процедур спроектированы таким образом, что сначала они извлекают только соответствующие строки этих огромных таблиц во временные таблицы, а затем временные таблицы соединяются друг с другом и с другими меньшими таблицами. таблицы для создания окончательной выписки. Что-то похожее на это:
SELECT COL1, COL2, COL3
INTO #TABLE1
FROM HUGETABLE1
WHERE COL4 IN ('foo', 'bar');
SELECT COL1, COL102, COL103
INTO #TABLE2
FROM HUGETABLE2
WHERE COL14 = 'blah';
SELECT COL1, COL103, COL306
FROM #TABLE1 AS T1
JOIN #TABLE2 AS T2
ON T1.COL1 = T2.COL1
LEFT JOIN SMALLTABLE AS ST
ON T1.COL3 = ST.COL3
ORDER BY T1.COL1;
Как правило, временные таблицы не изменяются после их создания (поэтому никаких последующих операций ALTER, UPDATE или INSERT). Для целей этого обсуждения предположим, что временные таблицы используются позже только один раз (поэтому на них будет полагаться только один запрос SELECT).
Вот вопрос: стоит ли индексировать эти временные таблицы после их создания и до того, как они будут использованы в последующем запросе?
Мой коллега считает, что создание индекса ускорит операции соединения и сортировки. Я считаю, однако, что общее время будет больше, потому что создание индекса требует времени. Другими словами, я предполагаю, что за исключением пограничных случаев (таких как временная таблица, которая сама по себе очень велика, или окончательный запрос SELECT очень сложен), SQL Server будет использовать статистику, которую он имеет по временным таблицам, для оптимизации окончательного запроса. и при этом он будет эффективно индексировать временные таблицы по своему усмотрению.
Другими словами, я привык думать, что создание индекса полезно только в том случае, если вы знаете, что эта таблица часто используется; одноразовая временная таблица, которая удаляется после завершения хранимой процедуры, не стоит индексировать.
Ни один из нас не знает об оптимизаторе SQL Server достаточно, чтобы понять, в чем мы правы, а в чем ошибаемся. Не могли бы вы помочь нам лучше понять, какие из наших предположений ближе к истине?