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

Откуда:
Сообщений: 316
Здравствуйте.
Есть вопросы по поводу того, как работают CTE.
к примеру, есть несколько CTE, которые вызывают друг друга:
+
WITH cte1 as
(
	select ...
	from ...
),
cte2 as
(
	select ...
	from ...
	inner join cte1
		on ....
),
cte3 as
(
	select ...
	from cte2
),
cte4 as
(
	select ...
	from cte3
	Inner join cte2
		on ...
	Left Join cte3
		on ...
	where cte3.[...] is not null
)
1) насколько я могу предположить, CTE хранят запрос к данным, но не сами данные?
2) если предполагается обращение к результату CTE больше одного раза, то, наверное, целесообразно сохранить во временную таблицу или результат как-то кешируется?
7 апр 16, 16:08    [19028685]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Novichok
1) насколько я могу предположить, CTE хранят запрос к данным, но не сами данные?

CTE - это просто такая форма оформления текста запроса

_Novichok
2) если предполагается обращение к результату CTE больше одного раза, то, наверное, целесообразно сохранить во временную таблицу или результат как-то кешируется?

больше одного раза == в других запросах ?
7 апр 16, 16:10    [19028703]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
1. CTE всего лишь логическая абстракция кода (впрочем внутри пара интересных отличий которые на перфоманс влияют)
2. Ничего не кешируется и на microsoft connect уже лет так 5 висит фича - добавить кеширование :)
7 апр 16, 16:13    [19028723]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Вот хороший пример по поводу CTE и п1.

http://stackoverflow.com/questions/34291399/sql-query-tuning-ms-sql-server-2012
7 апр 16, 16:17    [19028745]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
_Novichok
Member

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

Glory
больше одного раза == в других запросах ?


больше одного раза == или в последующих CTE
или в финальном запросе, в примере приводил
...
,cte4 as
(
	select ...
	from cte3
	Inner join cte2
		on ...
	Left Join cte3
		on ...
	where cte3.[...] is not null
)


AlanDenton
1. CTE всего лишь логическая абстракция кода (впрочем внутри пара интересных отличий которые на перфоманс влияют)

вот это тоже было бы интересно
7 апр 16, 16:36    [19028841]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Novichok
больше одного раза == или в последующих CTE

Не понимаю ваш сленг

Запрос - это единая команда. И запрос, начинающийся с WITH, это тоже единая команда.
И она выполняентся сразу целиком, а не частями.
7 апр 16, 16:40    [19028862]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
_Novichok
Member

Откуда:
Сообщений: 316
Glory,
В примере забыл дописать запрос ко всей цепочке CTE
WITH cte1 as
(
	select ...
	from ...
),
cte2 as
(
	select ...
	from ...
	inner join cte1
		on ....
),
cte3 as
(
	select ...
	from cte2
),
cte4 as
(
	select ...
	from cte3
	Inner join cte2
		on ...
	Left Join cte3
		on ...
	where cte3.[...] is not null
)
select *
from cte4
inner join cte3
	on ...
inner join cte2
	on ...

как можно видеть в cte4 идет обращение к cte3 и cte2, также и в финальном запросе идет обращение к этим CTE.
Вот это я имел в виду
7 апр 16, 16:48    [19028919]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
_Novichok,
упорно... много ж раз написали уже
автор
cte запрос - это единая команда
7 апр 16, 16:50    [19028929]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
_Novichok
Member

Откуда:
Сообщений: 316
может меня немного не поняли

каждое обращение к той или иной CTE из последующей CTE или с финального запрос - это просто запрос к БД.

Так как
AlanDenton
2. Ничего не кешируется и на microsoft connect уже лет так 5 висит фича - добавить кеширование :)

то мой вопрос заключался в том, не лучше было бы в целях производительности немного поменять структуру кода так, чтобы результаты запросов определенных CTE, обращение к которым осуществляется больше одного раза слить во временную таблицу / таблицы и обращаться уже к ней / ним, чтобы по несколько раз не запрашивать одни и те же данные?

Мне показалось так было бы логичнее.

Например,
with cte1 as
(
	select ...
	from ...
)
,cte2 as
(
	select ...
	from cte1
)
,cte3 as 
(
	select ...
	from cte2
	inner join someTable1 
		on ...
)
,cte4 as
(
	select ...
	from cte2
	inner join someTable2
		on ...
)

заменить на
with cte1 as
(
	select ...
	from ...
)
select * 
into #tempTable
from cte1

select ...
from #tempTable
inner join someTable1 
		on ...
		
select ...
from #tempTable
inner join someTable2
		on ...
7 апр 16, 17:51    [19029257]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
_Novichok,

а cte для этого использовать потому что модно?
7 апр 16, 17:56    [19029287]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Novichok
может меня немного не поняли

каждое обращение к той или иной CTE из последующей CTE или с финального запрос - это просто запрос к БД.

Нет, это вы не понимаете.
Нет никакого "обращение к той или иной cte"
Есть один большой запрос, в котором использовано оформление текста через cte
7 апр 16, 20:27    [19029820]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
_Novichok
мой вопрос заключался в том, не лучше было бы в целях производительности немного поменять структуру кода так, чтобы результаты запросов определенных CTE, обращение к которым осуществляется больше одного раза слить во временную таблицу / таблицы и обращаться уже к ней / ним, чтобы по несколько раз не запрашивать одни и те же данные?
На абстрактном запросе - без разницы.
На конкретном - смотрите планы и тестируйте, что будет быстрее. Какие фильтры? Много ли данных? Как часто к ним надо обращаться? Есть ли индексы? Не слетает ли статистика? ...
Ваш вопрос из разряда - что лучше коньки или ласты?
8 апр 16, 03:13    [19030598]     Ответить | Цитировать Сообщить модератору
 Re: Логика работы с Common Table Expression  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Посмотрите план, там все будет видно
8 апр 16, 22:09    [19035157]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить