Используйте временную таблицу вместо CTE для одноразового использования - PullRequest
0 голосов
/ 19 декабря 2018

1 Как я знаю, CTE больше используется для удобочитаемости запросов, а не для производительности.Не говоря об индексации, следует ли нам просто использовать временную таблицу во всех случаях вместо CTE, потому что в любом случае нет никакого выигрыша в производительности, и временная таблица может достичь того же результата, что и CTE?

2 Но я все еще не могу получить это:Таблицы Temp физически создаются в базе данных Tempdb, в то время как CTE не материализуется.Они созданы в памяти и уничтожены сразу после следующего утверждения.Должны ли мы иметь быструю лучшую производительность для доступа к тем же данным в памяти вместо материализованного дискового пространства?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Таблицы Temp физически создаются в базе данных Tempdb, а CTE не материализуется. Они создаются в памяти и удаляются сразу после следующего оператора.

Это неправильно.CTE не создается, это не структура, содержащая данные.Это как view с той лишь разницей, что его определение не сохраняется как объект.Как следствие, он не может быть повторно использован в других утверждениях.Это просто еще одна форма написания производной таблицы.

Например, когда вы пишете

with USAcusts as 
( 
  select custid, companyname 
  from sales.customers 
  where country = N'USA' 
) 
select * from USAcusts;

Это то же самое, что и код ниже:

select *
from
   ( 
  select custid, companyname 
  from sales.customers 
  where country = N'USA' 
   ) t

Ни один из CTE или derived table не созданв памяти ", как и в случае view, SQL Server расширяет определение табличного выражения и запрашивает базовые объекты напрямую .

0 голосов
/ 19 декабря 2018

Если вы ищете производительность, всегда используйте временную таблицу.

Я буду использовать CTE только по следующим причинам:

  • очень маленький и 1 раз использовать временные данные
  • рекурсивный запрос
...