Sql-Server
子查詢能否產生與 CTE 不同的執行計劃?
我正在和老闆交談,他更喜歡子查詢而不是 CTE。就個人而言,我討厭子查詢。他提到子查詢可以更快,但我不相信。我進行了這個簡短的測試:
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.Classkey
有一個執行計劃:
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.Classkey
具有相同的執行計劃:
https://www.brentozar.com/pastetheplan/?id=rJs_LbVSr
**問題:**總是這樣嗎?在 SQL Server 奇異而奇妙的世界中,答案似乎總是視情況而定。
照原樣,我認為這個問題是無法回答的。不可能證明是否定的,並且您不會在產品文件中找到保證。如果您想了解兩種方法之間技術差異的範例,請觀看幾分鐘的 Paul White 的查詢優化器深入探討會議。目前尚不清楚有人如何將其轉化為性能最佳實踐。
我建議將問題作為編碼風格來解決,而不是試圖找到性能最佳實踐。為派生表切換 CTE 或為 CTE 切換派生表並不是重寫查詢的有意義的方式。