Использование предложения WITH в SQL Server

Как работает предложение with в SQL Server? Действительно ли это дает мне повышение производительности или просто помогает создавать более читаемые сценарии?

Когда это правильно использовать? Что вы должны знать о предложении with, прежде чем начать использовать его?

Вот пример того, что я говорю:

http://www.dotnetspider.com/resources/33984-Use-With-Clause-Sql-Server.aspx

Ответ 1

Если вы не используете рекурсивные способности, CTE не лучше, чем простой встроенный просмотр.

Это просто избавляет вас от ввода текста.

Оптимизатор может решить, переоценивать его или нет, когда он повторно используется, и в большинстве случаев он решает переоценить:

WITH    q (uuid) AS
        (
        SELECT  NEWID()
        )
SELECT  *
FROM    q
UNION ALL
SELECT  *
FROM    q

вернет вам два разных NEWIDs.

Обратите внимание, что другие двигатели могут вести себя по-разному.

PostgreSQL, в отличие от SQL Server, материализует CTEs.

Oracle поддерживает специальный подсказку /*+ MATERIALIZE */, который сообщает оптимизатору, должно ли оно материализоваться CTE или нет.

Ответ 2

Я не совсем уверен в преимуществах производительности, но я думаю, что это может определенно помочь в случае, когда использование подзапроса приводит к тому, что подзапрос выполняется несколько раз.

Кроме того, он может сделать код более читаемым и может также использоваться в случае, когда несколько подзапросов будут вырезать и вставлять один и тот же код в разных местах.

Что вы должны знать, прежде чем использовать его? Большой недостаток заключается в том, что, когда у вас есть CTE в представлении, вы не можете создать кластерный индекс в этом представлении. Это может быть большой болью, потому что SQL Server не имеет материализованных представлений и, конечно же, укусил меня раньше.

Ответ 3

with - это ключевое слово в SQL, которое просто сохраняет временный результат во временной таблице. Пример:

with a(--here a is the temporary table)
(id)(--id acts as colomn for table a )
 as(select colomn_name from table_name )

select * from a