Sql-Server

子查詢能否產生與 CTE 不同的執行計劃?

  • August 29, 2019

我正在和老闆交談,他更喜歡子查詢而不是 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 切換派生表並不是重寫查詢的有意義的方式。

引用自:https://dba.stackexchange.com/questions/246448