에서 MSDN :
파생 테이블과 달리 CTE는 자체 참조가 가능하며 동일한 쿼리에서 여러 번 참조 될 수 있습니다.
저는 CTE를 많이 사용하고 있지만 CTE의 이점에 대해 깊이 생각해 본 적이 없습니다.
동일한 쿼리에서 CTE를 여러 번 참조하는 경우 :
- 성능상의 이점이 있습니까?
- 자체 조인을 수행하는 경우 SQL Server가 대상 테이블을 두 번 스캔합니까?
에서 MSDN :
파생 테이블과 달리 CTE는 자체 참조가 가능하며 동일한 쿼리에서 여러 번 참조 될 수 있습니다.
저는 CTE를 많이 사용하고 있지만 CTE의 이점에 대해 깊이 생각해 본 적이 없습니다.
동일한 쿼리에서 CTE를 여러 번 참조하는 경우 :
답변:
일반적으로 CTE는 결코 성능을 향상시키지 않습니다 .
CTE는 본질적으로 일회용입니다. 저장된 추가 통계 나 인덱스는 없습니다. 하위 쿼리의 속기 기능을합니다.
내 의견으로는 그것들은 쉽게 남용 될 수 있습니다 (제 직장의 코드에서 많은 양의 남용을 보았습니다). 좋은 대답이 여기 있지만 , 두 번 이상 무언가를 참조하거나 수십만 행이 넘는 경우 #temp
대신 테이블에 넣고 색인을 만드십시오.
CTE
첫 번째 쿼리 후에 결과가 삭제되므로 a 를 사용하는 것이 좋습니다.
CTE가 매우 유용한 재귀 외에 한 곳은 복잡한보고 쿼리를 만들 때입니다. 일련의 CTE를 사용하여 필요한 데이터 청크를 얻은 다음 최종 선택에 결합합니다. 파생 테이블이 많거나 20 조인으로 동일한 작업을 수행하는 것보다 유지 관리가 더 쉽다는 것을 알았으며 일대 다 관계로 인해 여러 레코드의 영향없이 올바른 데이터를 반환한다는 것을 확신 할 수 있습니다 다른 조인. 간단한 예를 들어 보겠습니다.
;WITH Conferences (Conference_id)
AS
(select m.Conference_id
FROM mydb.dbo.Conference m
WHERE client_id = 10
and Conference_id in
(select Conference_id from mydb.dbo.Expense
where amount <>0
and amount is not null)
)
--select * from Conferences
,MealEaters(NumberMealEaters, Conference_id, AttendeeType)
AS
(Select count(*) as NumberMealEaters, m.Conference_id, AttendeeType
from mydb.dbo.attendance ma
join Conferences m on m.Conference_id = ma.Conference_id
where (ma.meals_consumed>0 or meals_consumed is null)and attended = 1
group by m.Conference_id)
--select * from MealEaters
,Expenses (Conference_id,expense_date, expenseDescription, RecordIdentifier,amount)
AS
(select Conference_id,max(expense_date) as Expense_date, expenseDescription, RecordIdentifier,sum(amount) as amount
FROM
(SELECT Conference_id,expense_date, amount, RecordIdentifier
FROM mydb.dbo.Expense
WHERE amount <> 0
and Conference_id IN
(SELECT Conference_id
FROM mydb.dbo.Conferences )
group by Conference_id, RecordIdentifier) a
)
--select * from Expenses
Select m.Conference_id,me.NumberMealEaters, me.AttendeeType, e.expense_date, e.RecordIdentifier,amount
from Conferences m
join mealeaters me on m.Conference_id = me.Conference_id
join expenses e on e.Conference_id = m.Conference_id
따라서 원하는 다른 정보를 분리하여 주석 처리 된 선택을 사용하여 각 부분의 주석을 해제하고 해당 범위까지만 실행하여 비용을 변경해야하는 경우 각 부분을 개별적으로 확인할 수 있습니다. 계산 (이 예에서)이 하나의 대규모 쿼리로 함께 혼합 된 경우보다 찾기가 더 쉽습니다. 물론 내가 사용하는 실제보고 쿼리는 일반적으로 예제보다 훨씬 더 복잡합니다.