Использование предложения With в SQL Server - PullRequest
2 голосов
/ 18 мая 2010

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 18 мая 2010

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

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

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

3 голосов
/ 18 мая 2010

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

Это просто экономит вам время при наборе текста.

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

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

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

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

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

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

0 голосов
/ 05 июля 2017

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
...