patternsqlMinor
Can subqueries produce different execution plans than CTE's?
Viewed 0 times
canproducethanctedifferentexecutionplanssubqueries
Problem
I was talking with the bossman, and he prefers subqueries over CTE's. Personally, I loathe subqueries. He mentioned that subqueries can be faster, but I am not convinced. I ran this short test:
has an excution plan of:
https://www.brentozar.com/pastetheplan/?id=SJYJUZNHS
has the same execution plan:
https://www.brentozar.com/pastetheplan/?id=rJs_LbVSr
Question: Is this always the case? In the weird and wonderful world of SQL Server, the answer always seems to be it depends.
with classes as
(select top 10 Classkey from dimclass
group by classkey
order by count(1) desc),
policies as (
select CarrierKey, policykey, periodeffectivedate from dimpolicy),
exposure as (
select policykey, classkey from DimExposure)
select * from policies p
inner join exposure x on p.PolicyKey = x.PolicyKey
inner join classes c on x.ClassKey = c.Classkeyhas an excution plan of:
https://www.brentozar.com/pastetheplan/?id=SJYJUZNHS
select p.CarrierKey, p.PolicyKey, p.periodeffectivedate from dimpolicy p
inner join (select policykey, classkey from DimExposure) x on p.PolicyKey = x.PolicyKey
inner join (select top 10 Classkey from dimclass
group by classkey
order by count(1) desc) c on x.ClassKey = c.Classkeyhas the same execution plan:
https://www.brentozar.com/pastetheplan/?id=rJs_LbVSr
Question: Is this always the case? In the weird and wonderful world of SQL Server, the answer always seems to be it depends.
Solution
As is, I'd argue that the question isn't answerable. It's impossible to prove a negative and you won't find a guarantee in the product documentation. If you'd like an example of a technical difference between the two approaches, watch a few minutes of Paul White's Query Optimizer Deep Dive session. It is not clear how someone could translate that into a performance best practice.
I suggest approaching the issue as a matter of coding style instead of trying to find a performance best practice. Switching out a CTE for a derived table or a derived table for a CTE is not a meaningful way to rewrite a query.
I suggest approaching the issue as a matter of coding style instead of trying to find a performance best practice. Switching out a CTE for a derived table or a derived table for a CTE is not a meaningful way to rewrite a query.
Context
StackExchange Database Administrators Q#246448, answer score: 6
Revisions (0)
No revisions yet.