Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Глупый вопрос про CTE  [new]
artii
Member

Откуда:
Сообщений: 104
Почему многократное обращение к CTE лучше, чем многократное выполнение запроса?
3 июл 14, 15:31    [16255570]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
artii
Почему многократное обращение к CTE лучше, чем многократное выполнение запроса?


? сте - это сахар
3 июл 14, 15:33    [16255583]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
artii, в смысле?
3 июл 14, 15:33    [16255584]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а почему вы так решили то ?
3 июл 14, 15:33    [16255586]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
artii
Member

Откуда:
Сообщений: 104
читаю статью http://msdn.microsoft.com/ru-ru/magazine/cc163346.aspx

и понял абзац вот такой абзац,

После того как выражение CTE определено, на него может многократно ссылаться первый следующий за ним запрос. Это особенно удобно, когда запрос должен ссылаться на выражение CTE более одного раза. В примере кода на рис. 3 показано, как запрос дважды ссылается на EmpOrdersCTE, что позволяет ему выбрать сотрудников и их руководителей. Это крайне удобно, если требуется сослаться на один и тот же набор строк более одного раза; проще дважды сослаться на CTE, чем дважды повторить запрос.


что лучше использовать многократно CTE, а почему не написано.
3 июл 14, 15:38    [16255625]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
artii, написано же - удобно. чтобы избежать дубирования текста
3 июл 14, 15:39    [16255626]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
artii
Member

Откуда:
Сообщений: 104
а, блин, т.е. это про удобство написания, а я что-то про производительность подумал.
3 июл 14, 15:40    [16255639]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
artii,

CTE можно рассматривать как inline view (как в общем-то и не раскрытый подзапрос).
select * from sys.dm_exec_query_optimizer_info where counter = 'view reference';
with cte as (select * from master..spt_values)
select * from cte option(recompile);
--select * from (select * from master..spt_values) cte option(recompile);
select * from sys.dm_exec_query_optimizer_info where counter = 'view reference';


VIEW, т.е. представление раскрывается в текст запроса во время выполнения и запрос оптимизируется целиком. Непонятно, что значит "лучше". С точки зрения производительности - не лучше. С точки зрения удобства - повышает читабельность иногда, но, лично я, не злоупотребляю этим. Рекурсивные CTE стоят особняком, там у них своя кухня.
3 июл 14, 15:50    [16255717]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
SomewhereSomehow
Рекурсивные CTE стоят особняком, там у них своя кухня.
интересных ссылок не завалялось, случайно?
3 июл 14, 15:58    [16255784]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Гадя Петрович,

Есть такая. Tricks? In T-SQL?
Где-то были еще, но сходу не найду.
3 июл 14, 16:05    [16255837]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
artii
Member

Откуда:
Сообщений: 104
SomewhereSomehow,

Т.е. если нет рекурсивности, то проигрыш в производительности относительно простого запроса, только, в постоянной рекомпиляции этого же запроса внутри CTE?
3 июл 14, 16:13    [16255906]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
artii
SomewhereSomehow,

Т.е. если нет рекурсивности, то проигрыш в производительности относительно простого запроса, только, в постоянной рекомпиляции этого же запроса внутри CTE?

Нет, постоянной рекомпиляции быть не должно, если у вас нет других факторов. Проигрыша как такового по сравнению с подзапросом - тоже нет. Может быть другой проигрыш, если человек думает, что CTE это некий временный материализованный результат и использует это не к месту.
Есть вот такая хотелка, кстати, сделать хинт, который бы принудительно указывал материализовать CTE. Имхо, хороший запрос, было бы полезно иногда, голосуйте, кто за Provide a hint to force intermediate materialization of CTEs or derived tables.
3 июл 14, 16:29    [16256011]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
_human
Member

Откуда:
Сообщений: 560
artii,
в случае использования CTE
пропадает возможность использовать выполнения выделенного куска кода, для отладки запроса.
;with cte(n) as (select 1)
select *
from 
        (select n from cte)
3 июл 14, 17:01    [16256252]     Ответить | Цитировать Сообщить модератору
 Re: Глупый вопрос про CTE  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
SomewhereSomehow
Имхо, хороший запрос, было бы полезно иногда, голосуйте, кто за Provide a hint to force intermediate materialization of CTEs or derived tables.
+1
3 июл 14, 20:08    [16257043]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить