Коллега работает в бизнесе, который использует 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, чтобы понять, в чем мы правы или нет. Не могли бы вы помочь нам лучше понять, какие из наших предположений ближе к истине?