Избегайте временных таблиц с SQL Server с CTE - PullRequest
0 голосов
/ 08 апреля 2019

Избегать временных таблиц с SQL Server с CTE

Я хочу избежать временных таблиц для возможного увеличения производительности?

Данные: 2 таблицы с одинаковым выходом Проблема: Я хочу объединить 2 CTE в 1 CTE для вывода.Кажется, что примеры, показывающие только объединения и уменьшение количества записей и т. Д. *

Без указания имен всех полей, которые я хочу сделать

WITH Table_A_CTE AS
(
    Select * from TableA
),
Table_B_CTE
(
    Select * from TableB
)
--Result
Select * from Table_A_CTE , Table_B_CTE
-- above is not going to work -  identical columns (as the number of columns and aliases for columns are the same)

Я видел ответ от stackoverflow с этим,но это вдвое больше записей, чем когда я делаю таблицу Temp и вставляю из TableA и TableB в таблицу temp и выбираю из таблицы Temp

SELECT * FROM Table_A_CTE
UNION ALL
SELECT * FROM Table_B_CTE
UNION ALL
SELECT * FROM Table_A_CTE

Я понимаю, что у CTE есть несколько целей, но я надеялсячтобы избежать временных таблиц и табличных переменных, которые одновременно попадают в базу данных tempdb и т.д ..

1 Ответ

0 голосов
/ 09 апреля 2019

25 секунд из ужасной временной таблицы с ВСЕГДА пишет в базу данных tempdb.Повторно запускается и снова и снова.

Теперь на CTE, сначала это заняло 10 секунд, потом - 1-2 секунды.да, я буду брать CTE за Temp Table каждый раз.Табличные переменные очень медленные с большим количеством записей, и они помещаются в базу данных tempdb в 99% случаев.

На данный момент, я не уверен, что когда-нибудь снова буду использовать табличные переменные, когда они обращаются к базе данных tempdb, они медленные, они ограничены.Временные таблицы - если мне нужно загрузить огромный объем данных, я мог бы использовать временную таблицу, в противном случае я использую CTE

Исходя из моего вышеупомянутого вопроса: я делаю это, и это прекрасно работает.

SELECT * FROM Table_A_CTE
UNION ALL
SELECT * FROM Table_B_CTE
...