SQL — CTE против VIEW

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

Я нашел аналогичный вопрос здесь, но он касается производительности.

Обновление 1:

Например: у меня есть база данных, заполненная сделками (tbl_trade). Мне нужно выбрать из 3,5 миллионов записей только те сделки, которые были открыты в текущем месяце до текущего времени, а затем манипулировать данными (с разными запросами к виртуальной таблице - это похоже на просмотр). Проблема здесь в том, что я хочу SUM из 3-4 столбцов, а затем мне нужно SUM некоторых столбцов и создать виртуальный столбец с результатом (выглядит как CTE).

Например: tbl_trade имеет столбцы: profit, bonus и expenses. Мне нужны SUM(profit),SUM(bonus),SUM(expenses) и новый столбец total, который будет равен SUM(profit)+SUM(bonus)+SUM(expenses).

PS. Повторный запуск запросов для SUM невозможен, так как у меня уже есть результат.

Заранее спасибо!


person BlackM    schedule 18.06.2015    source источник
comment
Представление — это объект в базе данных. CTE существует только на время одного запроса. Они кажутся очень разными. Можете ли вы привести пример выбора между ними?   -  person Gordon Linoff    schedule 18.06.2015
comment
С каким объемом данных вы имеете дело? CTE широко использует TempDb, и если ваш TempDb настроен неправильно или ваш CTE имеет дело с большим количеством строк, то это не лучший выбор. Выберите View при работе с большими объемами данных и CTE с небольшими. Вы также можете выбрать CTE, когда вам нужна рекурсия. Это все !   -  person Anuj Tripathi    schedule 18.06.2015
comment
Привет и спасибо за ваши ответы. см. обновленные вопросы   -  person BlackM    schedule 18.06.2015
comment
@BlackM проверь мой обновленный ответ.   -  person Anuj Tripathi    schedule 18.06.2015


Ответы (4)


Представления могут быть проиндексированы, а CTE — нет. Итак, это один важный момент.

CTE отлично работает на tree hierarchyт.е. рекурсивный

Кроме того, учитывайте представления при работе со сложными запросами. Представления представляют собой физический объект в базе данных (но не хранят данные физически) и могут использоваться в нескольких запросах, что обеспечивает гибкость и централизованный подход. CTE, с другой стороны, являются временными и будут создаваться при их использовании; вот почему они называются inline view.

Обновить

Согласно вашему обновленному вопросу, просмотры будут правильным выбором. Работа с 3,5 миллионами строк в CTE создаст дополнительную нагрузку на TempDb, что в конечном итоге снизит производительность SQL Server. Помните, что CTE — это одноразовое представление, поэтому статистика не сохраняется, и вы также не можете создавать индексы. Это похоже на подзапрос.

person Anuj Tripathi    schedule 18.06.2015
comment
CTE не очень хорошо работает с большим объемом данных по сравнению с представлениями. Это неправда. Нет никакой разницы между CTE и представлением, если представление не проиндексировано. - person Mikael Eriksson; 18.06.2015
comment
Но могу ли я добавить column1+column2 as column3 и представить его в запросе? - person BlackM; 18.06.2015
comment
@MikaelEriksson Верно, но при тестировании большого количества данных [рекурсивно] я обнаружил высокое использование tempdb, а значит, низкую производительность. Тем не менее, я по-прежнему считаю ваш комментарий правильным, и я изменяю свой ответ. - person Anuj Tripathi; 18.06.2015
comment
@BlackM Вы можете добавить вычисляемый столбец в представления, а также создать CTE внутри представления. - person Anuj Tripathi; 18.06.2015

Оба будут интерпретироваться оптимизатором плана одинаково. Это просто другое.

Представление может быть использовано само по себе. Он может инкапсулировать сложные операторы в более простой запрос.

Где CTE в основном используется для написания более чистого кода с меньшей избыточностью, например, в процедурах/представлениях. Вы также можете использовать CTE для рекурсивных запросов, что является очень хорошей и мощной функцией!

Надеюсь, это поможет прояснить ситуацию.

person Ionic    schedule 18.06.2015

Одна из причин выбора CTE: если вы выполняете иерархические запросы, используйте CTE. CTE можно вызывать рекурсивно. Представления нельзя вызывать рекурсивно.

person zedfoxus    schedule 18.06.2015

CTE существует в памяти только во время выполнения запроса. После выполнения запроса CTE отбрасывается; его нельзя использовать для следующего SQL-запроса, если мы не определим его снова. Тем не менее, на одно и то же CTE можно ссылаться несколько раз в основном запросе и любых подзапросах.

Представление — это сохраненный SQL-запрос, который выполняется каждый раз, когда вы ссылаетесь на него в другом запросе. Обратите внимание, что представление не хранит вывод конкретного запроса — оно хранит сам запрос.

Главное, что нужно помнить о представлениях SQL, это то, что, в отличие от CTE, представление является физическим объектом в базе данных и хранится на диске. Однако представления хранят только запрос, а не данные, возвращаемые запросом. Данные вычисляются каждый раз, когда вы ссылаетесь на представление в запросе.

person MILASHU BELAY    schedule 19.04.2021