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

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

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

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

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


person hgulyan    schedule 18.05.2010    source источник


Ответы (3)


Если вы не используете рекурсивные возможности, CTE не лучше с точки зрения производительности, чем простое встроенное представление.

Это просто избавит вас от необходимости печатать.

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

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

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

Обратите внимание, что другие движки могут вести себя иначе.

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

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

person Quassnoi    schedule 18.05.2010

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

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

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

person Coxy    schedule 18.05.2010

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
person Nandish    schedule 05.07.2017
comment
Это неверно (на момент написания). CTE в SQL Server не материализуют данные (в Oracle и PostgreSQL все по-другому). Вы можете проверить это самостоятельно, написав CTE и ссылаясь на него несколько раз позже в запросе. Если вы посмотрите на план запроса, вы увидите, что SQL внутри CTE выполняется каждый раз, когда на него ссылаются, а не только один раз. Это может быть скрытой ловушкой производительности для новых игроков. Возможно материализовать данные с помощью временной таблицы будет дешевле, чем выполнять один и тот же SELECT несколько раз. - person DatumPoint; 13.02.2019