強(qiáng)制SQL Server執(zhí)行計劃使用并行提升在復(fù)雜查詢語句下的性能
通過觀察執(zhí)行計劃,發(fā)現(xiàn)之前的執(zhí)行計劃在很多大表連接的部分使用了Hash Join,由于涉及的表中數(shù)據(jù)眾多,因此查詢優(yōu)化器選擇使用并行執(zhí)行,速度較快。而我們優(yōu)化完的執(zhí)行計劃由于索引的存在,且表內(nèi)數(shù)據(jù)非常大,過濾條件的值在一個很寬的統(tǒng)計信息步長范圍內(nèi),導(dǎo)致估計行數(shù)出現(xiàn)較大偏差(過濾條件實際為15000行,步長內(nèi)估計的平均行數(shù)為800行左右),因此查詢優(yōu)化器選擇了Loop Join,且沒有選擇并行執(zhí)行,因此執(zhí)行時間不降反升。
由于語句是在存儲過程中實現(xiàn),因此我們直接對該語句使用一個undocument查詢提示,使得該查詢的并行開銷閾值強(qiáng)制降為0,使得該語句強(qiáng)制走并行,語句執(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.
該語句默認(rèn)不會走并行,執(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.
在面對一些復(fù)雜的DSS或OLAP查詢時遇到類似的情況,可以考慮使用該Undocument提示要求SQL Server盡可能的使用并行,從而降低執(zhí)行時間。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信