Sql-Server
‘SELECT *’ 子查詢效率低嗎?
我們有一個第三方分析平台,允許最終使用者從一系列預定義視圖中創建自己的表格和圖表。這將查詢 MS SQL 數據庫。
不幸的是,根據我的知識和理解,該軟體注入數據庫以查詢數據的 SQL 語法似乎非常低效,或者看起來如此。
例如,將兩個表連接在一起的查詢可能如下所示:
SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree FROM (SELECT * FROM tblOne) AS tblOne JOIN (SELECT * FROM tblTwo) AS tblTwo ON tblOne.id = tblTwo.id
現在想像這些表每個都有很多列,或者有更多的連接到其他表,每個都遵循相同的模式 - 我假設這會在子查詢中執行全表掃描,有效地讀取比實際需要的更多的內容,這是否正確?我是否也正確假設以下內容實際上會更有效?
SELECT tblOne.ColumnOne, tblOne.ColumnTwo, tblTwo.ColumnThree FROM tblOne JOIN tblTwo ON tblOne.id = tblTwo.id
在我給這個分析解決方案的開發人員寫一封措辭強硬的電子郵件之前,我只是想要第二個意見,以防我誤解了引擎如何處理這樣的查詢。
提前致謝。
我是否正確假設這將在子查詢中執行全表掃描,有效地讀取超出實際需要的內容?
不,查詢優化器應該看穿這一點。沒有在查詢執行中具體化子查詢的一般規則。
我是否也正確假設以下內容實際上會更有效?
如果有足夠多的連接和子查詢,您可能會得到一個糟糕的計劃。但這不是第一個看的地方。使用查詢儲存 (SQL 2016+)、計劃記憶體 DMV 或 XEvents 來查看查詢計劃和相關的資源成本。
例如在 AdventureWorksDW 上,這兩個查詢使用相同的計劃。
select p.Color, sum(f.SalesAmount) SalesAmount from (select * from FactInternetSales) f join (select * from DimProduct) p on p.ProductKey = f.ProductKey group by p.Color go select p.Color, sum(f.SalesAmount) SalesAmount from FactInternetSales f join DimProduct p on p.ProductKey = f.ProductKey group by p.Color