強制SQL Server執(zhí)行計劃使用并行提升在復雜查詢語句下的性能
通過觀察執(zhí)行計劃,發(fā)現(xiàn)之前的執(zhí)行計劃在很多大表連接的部分使用了Hash Join,由于涉及的表中數(shù)據(jù)眾多,因此查詢優(yōu)化器選擇使用并行執(zhí)行,速度較快。而我們優(yōu)化完的執(zhí)行計劃由于索引的存在,且表內(nèi)數(shù)據(jù)非常大,過濾條件的值在一個很寬的統(tǒng)計信息步長范圍內(nèi),導致估計行數(shù)出現(xiàn)較大偏差(過濾條件實際為15000行,步長內(nèi)估計的平均行數(shù)為800行左右),因此查詢優(yōu)化器選擇了Loop Join,且沒有選擇并行執(zhí)行,因此執(zhí)行時間不降反升。
由于語句是在存儲過程中實現(xiàn),因此我們直接對該語句使用一個undocument查詢提示,使得該查詢的并行開銷閾值強制降為0,使得該語句強制走并行,語句執(zhí)行時間由20秒降為5秒(注:使用Hash Join提示是7秒)。
下面通過一個簡單的例子展示使用該提示的效果,示例T-SQL如代碼清單1所示:
SELECT * FROM [AdventureWorks].[Sales].[SalesOrderDetail] a INNER JOIN [Sales].SalesOrderHeader b ON a.SalesOrderID=b.SalesOrderID
代碼清單1.
該語句默認不會走并行,執(zhí)行計劃如圖1所示:

圖1.
下面我們對該語句加上提示,如代碼清單2所示。
SELECT * FROM [AdventureWorks].[Sales].[SalesOrderDetail] a INNER JOIN [Sales].SalesOrderHeader b ON a.SalesOrderID=b.SalesOrderID OPTION(querytraceon 8649)
代碼清單2.
此時執(zhí)行計劃會按照提示走并行,如圖2所示:

圖2.
在面對一些復雜的DSS或OLAP查詢時遇到類似的情況,可以考慮使用該Undocument提示要求SQL Server盡可能的使用并行,從而降低執(zhí)行時間。
相關(guān)文章
SQL Server誤設置max server memory的處理方法
這篇文章主要給大家介紹了關(guān)于SQL Server誤設置max server memory的處理方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用SQL Server具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧下2019-12-12
SQL Server觸發(fā)器及觸發(fā)器中的事務學習
首先, 說下我寫篇文章的目的,我希望能把我對觸發(fā)器的理解,分享出來與你一起學習2011-05-05
Sql?server連接Oracle數(shù)據(jù)庫完整圖文教程
又一次在項目中用到了在SQLServer添加Oracle鏈接服務器,索性這里總結(jié)下,這篇文章主要給大家介紹了關(guān)于Sql?server連接Oracle數(shù)據(jù)庫的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-01-01
CMD命令操作MSSQL2005數(shù)據(jù)庫(命令整理)
創(chuàng)建數(shù)據(jù)庫、創(chuàng)建用戶、修改數(shù)據(jù)的所有者、設置READ_COMMITTED_SNAPSHOT以及備份、日志扥等等,感興趣的朋友可以參考下2013-05-05
SQLServer中防止并發(fā)插入重復數(shù)據(jù)的方法詳解
本文主要介紹了SQLServer中防止并發(fā)插入重復數(shù)據(jù)的方法,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03
SQL Server誤區(qū)30日談 第20天 破壞日志備份鏈之后,需要一個完整備份來重新開始日志鏈
事務日志備份會備份自上次事務日志備份以來所有的事務日志(如果從來沒有過日志備份的話,那就從上一次完整備份開始)。有好幾種類型的操作會中斷事務日志的連續(xù)性,也就是說除非重新開始新的日志鏈,SQL Server無法再進行日志備份2013-01-01

