強(qiáng)制SQL Server執(zhí)行計(jì)劃使用并行提升在復(fù)雜查詢語(yǔ)句下的性能
通過觀察執(zhí)行計(jì)劃,發(fā)現(xiàn)之前的執(zhí)行計(jì)劃在很多大表連接的部分使用了Hash Join,由于涉及的表中數(shù)據(jù)眾多,因此查詢優(yōu)化器選擇使用并行執(zhí)行,速度較快。而我們優(yōu)化完的執(zhí)行計(jì)劃由于索引的存在,且表內(nèi)數(shù)據(jù)非常大,過濾條件的值在一個(gè)很寬的統(tǒng)計(jì)信息步長(zhǎng)范圍內(nèi),導(dǎo)致估計(jì)行數(shù)出現(xiàn)較大偏差(過濾條件實(shí)際為15000行,步長(zhǎng)內(nèi)估計(jì)的平均行數(shù)為800行左右),因此查詢優(yōu)化器選擇了Loop Join,且沒有選擇并行執(zhí)行,因此執(zhí)行時(shí)間不降反升。
由于語(yǔ)句是在存儲(chǔ)過程中實(shí)現(xiàn),因此我們直接對(duì)該語(yǔ)句使用一個(gè)undocument查詢提示,使得該查詢的并行開銷閾值強(qiáng)制降為0,使得該語(yǔ)句強(qiáng)制走并行,語(yǔ)句執(zhí)行時(shí)間由20秒降為5秒(注:使用Hash Join提示是7秒)。
下面通過一個(gè)簡(jiǎn)單的例子展示使用該提示的效果,示例T-SQL如代碼清單1所示:
SELECT * FROM [AdventureWorks].[Sales].[SalesOrderDetail] a INNER JOIN [Sales].SalesOrderHeader b ON a.SalesOrderID=b.SalesOrderID
代碼清單1.
該語(yǔ)句默認(rèn)不會(huì)走并行,執(zhí)行計(jì)劃如圖1所示:
圖1.
下面我們對(duì)該語(yǔ)句加上提示,如代碼清單2所示。
SELECT * FROM [AdventureWorks].[Sales].[SalesOrderDetail] a INNER JOIN [Sales].SalesOrderHeader b ON a.SalesOrderID=b.SalesOrderID OPTION(querytraceon 8649)
代碼清單2.
此時(shí)執(zhí)行計(jì)劃會(huì)按照提示走并行,如圖2所示:
圖2.
在面對(duì)一些復(fù)雜的DSS或OLAP查詢時(shí)遇到類似的情況,可以考慮使用該Undocument提示要求SQL Server盡可能的使用并行,從而降低執(zhí)行時(shí)間。
相關(guān)文章
Sql server中內(nèi)部函數(shù)fn_PhysLocFormatter存在解析錯(cuò)誤詳解
這篇文章主要給大家介紹了關(guān)于Sql server中內(nèi)部函數(shù)fn_PhysLocFormatter存在解析錯(cuò)誤的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09mssql2005,2008導(dǎo)出數(shù)據(jù)字典實(shí)現(xiàn)方法
在項(xiàng)目開發(fā)過程中會(huì)用到數(shù)據(jù)字典,本文將詳細(xì)介紹mssql2005,2008如何導(dǎo)出數(shù)據(jù)字典,需要了解更多的朋友可以參考下2012-11-11SQLite3數(shù)據(jù)庫(kù)的介紹和使用教程(面向業(yè)務(wù)編程-數(shù)據(jù)庫(kù))
這篇文章主要介紹了SQLite3數(shù)據(jù)庫(kù)的介紹和使用(面向業(yè)務(wù)編程-數(shù)據(jù)庫(kù)),本文從SQLite3的庫(kù)的獲取、工程管理、SQL語(yǔ)句介紹、C語(yǔ)言編程四個(gè)角度闡述了SQLite3數(shù)據(jù)庫(kù)的實(shí)際應(yīng)用,需要的朋友可以參考下2023-05-05sqlserver獲取當(dāng)前日期的最大時(shí)間值
如果你有看到這篇,會(huì)看到Insus.NET在SQL Server2008使用最簡(jiǎn)單的方法取到午夜時(shí)間值。2011-09-09數(shù)據(jù)庫(kù)Left join , Right Join, Inner Join 的相關(guān)內(nèi)容,非常實(shí)用
Left join , Right Join, Inner Join 的相關(guān)內(nèi)容,非常實(shí)用2009-07-07MSsql每天自動(dòng)備份數(shù)據(jù)庫(kù)并每天自動(dòng)清除log的腳本
有自己服務(wù)器的朋友需要用到的東西,因?yàn)閙ssql數(shù)據(jù)需要經(jīng)常備份2008-09-09