Производная таблица является логической конструкцией.
Он может храниться в tempdb
, построенном во время выполнения, переоценивая базовый оператор каждый раз, когда к нему обращаются, или даже оптимизируется вообще.
Временная таблица - это физическая конструкция. Это таблица в tempdb
, которая создается и заполняется значениями.
Какой из них лучше, зависит от запроса, в котором они используются, оператора, который используется для получения таблицы, и многих других факторов.
Например, CTE
(общие табличные выражения) в SQL Server
могут (и, скорее всего, будут) переоцениваться при каждом их использовании. Этот запрос:
WITH q (uuid) AS
(
SELECT NEWID()
)
SELECT *
FROM q
UNION ALL
SELECT *
FROM q
будет наиболее вероятно даст два разных NEWID()
.
В этом случае следует использовать временную таблицу, поскольку она гарантирует, что ее значения сохранятся.
С другой стороны, этот запрос:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM master
) q
WHERE rn BETWEEN 80 AND 100
лучше с производной таблицей, потому что использование временной таблицы потребует извлечения всех значений из master
, в то время как это решение будет просто сканировать первые 100
записи с использованием индекса id
.