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

Откуда: glubinka
Сообщений: 4256
  WITH cte AS
  (
		SELECT slnxjob_type as f1, AVG(slnxjob_type) as f2, COUNT(slnxjob_type) as f3 
			FROM (VALUES (1), (2), (3), (4), (5), (6), (7)) x(slnxjob_type) group by slnxjob_type
  )
      SELECT b.f1, c.f2, d.f4 from cte a
	    left join 
		(
			SELECT f1 from cte
		)b on b.f1 = a.f1
	    left join 
		(
			SELECT f2 from cte
		)c on c.f2 = a.f1
	    left join 
		(
			SELECT q.f3, (sum(q.f1) * sum(d.f2)) as f4 from cte q, cte d group by q.f3
		)d on d.f3 = a.f1
8 май 15, 21:09    [17620168]     Ответить | Цитировать Сообщить модератору
 Re: Это мне только кажется что CTE выполняется каждый раз для каждого подзапроса?  [new]
o-o
Guest
Lepsik,

конечно для каждого считается,
это же не временная таблица/переменная, это "вью, не оформленное в объект,
т.е. умирающее вместе с соответствующим селектом".
это просто вы, чтобы не повторять кусок кода 3 раза, его поименовали,
и воспользовались тем, что поименованный кусок виден нижеследующему селекту,
т.е. тот кусок кода можно заменить, написав 3 буквы CTE.
а при выполнении определение просто раскрывается в запросе столько раз, сколько есть.
т.е. это упрощение записи для удобочитаемости, но оно никак не оптимизирует/ не ухудшает запрос
8 май 15, 21:23    [17620238]     Ответить | Цитировать Сообщить модератору
 Re: Это мне только кажется что CTE выполняется каждый раз для каждого подзапроса?  [new]
o-o
Guest
официально по этому поводу вот:
Using Common Table Expressions
A CTE is similar to a derived table in that it is not stored as an object and lasts only for the duration of the query. Unlike a derived table, a CTE can be self-referencing and can be referenced multiple times in the same query.
Using a CTE offers the advantages of improved readability and ease in maintenance of complex queries. The query can be divided into separate, simple, logical building blocks. These simple blocks can then be used to build more complex, interim CTEs until the final result set is generated.
+
Microsoft SQL Server 2012 T-SQL Fundamentals
table expressions typically have no performance impact because they are not physically materialized anywhere.
8 май 15, 21:36    [17620294]     Ответить | Цитировать Сообщить модератору
 Re: Это мне только кажется что CTE выполняется каждый раз для каждого подзапроса?  [new]
Gviber
Member

Откуда:
Сообщений: 124
Можно объявить переменную: DECLARE @table TABLE и вставить результат with туда + добавить PRIMARY KEY или UNIQUE на нужные поля.

В книгах для оптимизации производительности (в похожих случаях) советуют так делать.
9 май 15, 19:38    [17622222]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить