2010-05-18 2 views
2

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

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

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

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

ответ

3

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

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

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

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

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

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

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

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

5

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

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

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

+1

Не удалось принять два ответа, но спасибо :) – hgulyan

0

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 
Смежные вопросы