Иногда мы можем записать запрос и с полученной таблицей и с временной таблицей. мой вопрос - это, какой лучше? почему?
Производная таблица - это логическая конструкция.
Он может храниться в 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
лучше подходит для производной таблицы, потому что использование временной таблицы потребует выборки всех значений из главного
, в то время как это решение будет сканировать только первый ] 100
записей с использованием индекса на id
.
Это зависит от обстоятельств.
Преимущества производных таблиц:
Производная таблица является частью более крупного, единого запроса и будет оптимизирована в контексте остальной части запроса. Это может быть преимуществом, если оптимизация запроса помогает производительности (обычно так и происходит, за некоторыми исключениями). Пример: если вы заполняете временную таблицу, а затем используете результаты во втором запросе, вы фактически привязываете механизм базы данных к одному методу выполнения (выполнить первый запрос полностью, сохранить весь результат, выполнить второй запрос), в то время как при использовании производной таблицы оптимизатор может найти более быстрый метод выполнения или путь доступа.
Производная таблица "существует" только в плане выполнения запроса - это чисто логическая конструкция. На самом деле никакой таблицы не существует.
Преимущества временных таблиц
Таблица "существует" - то есть она материализована в виде таблицы, по крайней мере в памяти, которая содержит набор результатов и может быть использована повторно.
В некоторых случаях производительность может быть улучшена или уменьшена блокировка, когда вам нужно выполнить какое-то сложное преобразование данных - например, если вы хотите получить "моментальный" набор строк из базовой таблицы, которая занята, а затем выполнить какой-то сложный расчет на этом наборе, может быть меньше разногласий, если вы получите строки из базовой таблицы и разблокируете ее как можно быстрее, а затем выполните работу независимо. В некоторых случаях накладные расходы на настоящую временную таблицу малы по сравнению с преимуществом в параллельности.