翻譯|使用教程|編輯:吳園園|2020-06-18 14:38:56.347|閱讀 221 次
概述:在dbForge Studio for SQL Server中借助SQL Profiler對執行計劃進行分步分析,可以檢測查詢性能的瓶頸。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
dbForge Studio for SQL Server為有效的探索、分析SQL Server數據庫中的大型數據集提供全面的解決方案,并設計各種報表以幫助作出合理的決策。
點擊下載dbForge Studio for SQL Server最新試用版
讓我們通過執行“比較所選結果”命令來比較結果:
我們必須說,UNPIVOT和VALUES查詢的執行速度沒有明顯差異。這適用于將列簡單轉換為行的情況。
讓我們檢查另一個任務,我們需要為每個玩家找到游戲中最頻繁的結果。
我們將嘗試在UNPIVOT聲明的幫助下完成此任務:
SELECT PlayerID , GameType = ( SELECT TOP 1 GameType FROM dbo.Players UNPIVOT ( GameCount FOR GameType IN ( Win, Defeat, StandOff ) ) unpvt WHERE PlayerID = p.PlayerID ORDER BY GameCount DESC ) FROM dbo.Players p
在執行計劃中,它表明瓶頸是多重數據讀取和排序,這對于組織數據行是必需的:
如果我們記得可以使用外部查詢塊中的列,則很容易擺脫多重數據讀?。?
SELECT p.PlayerID , GameType = ( SELECT TOP 1 GameType FROM (SELECT t = 1) t UNPIVOT ( GameCount FOR GameType IN ( Win, Defeat, StandOff ) ) unpvt ORDER BY GameCount DESC ) FROM dbo.Players p
消除了多次讀取數據,但是最耗資源的操作–排序仍然存在:
這就是VALUES語句在此任務期間的行為:
SELECT t.PlayerID , GameType = ( SELECT TOP 1 GameType FROM ( VALUES (Win, 'Win') , (Defeat, 'Defeat') , (StandOff, 'StandOff') ) t (GameCount, GameType) ORDER BY GameCount DESC ) FROM dbo.Players t
正如我們期望的那樣,該計劃得到了簡化,但是仍然存在排序:
讓我們嘗試通過使用聚合函數來避免排序:
SELECT t.PlayerID , GameType = ( SELECT TOP 1 GameType FROM ( VALUES (Win, 'Win') , (Defeat, 'Defeat') , (StandOff, 'StandOff') ) t (GameCount, GameType) WHERE GameCount = ( SELECT MAX(Value) FROM ( VALUES (Win), (Defeat), (StandOff) ) t(Value) ) ) FROM dbo.Players t
現在執行計劃如下所示:
我們設法擺脫了排序。
結論
當需要在SQL Server中將列轉換為行時,最好使用UNPIVOT或VALUES結構。
如果在轉換之后,應該將接收到的數據行用于聚合或排序,那么我們最好使用VALUES結構,這在大多數情況下會導致更有效的執行計劃。
對于可能出現不同結構類型且列數不受限制的表,建議使用XML,它與動態SQL不同,可以在表函數內部使用。
在dbForge Studio for SQL Server中借助SQL Profiler對執行計劃進行分步分析,可以檢測查詢性能的瓶頸。
了解更多產品信息或想要購買產品正版授權請點擊
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: