亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL Server中參數(shù)化SQL寫法遇到parameter sniff ,導致不合理執(zhí)行計劃重用的快速解決方法

2024-08-31 01:04:00
字體:
供稿:網(wǎng)友

parameter sniff問題是重用其他參數(shù)生成的執(zhí)行計劃,導致當前參數(shù)采用該執(zhí)行計劃非最優(yōu)化的現(xiàn)象。想必熟悉數(shù)據(jù)的同學都應該知道,產(chǎn)生parameter sniff最典型的問題就是使用了參數(shù)化的SQL(或者存儲過程中使用了參數(shù)化)寫法,如果存在數(shù)據(jù)分布不均勻的情況下,正常情況下生成的執(zhí)行計劃,在傳入在分布數(shù)據(jù)較多的參數(shù)的情況下,重用了正常參數(shù)生成的執(zhí)行計劃,而這種緩存的執(zhí)行計劃并非適合當前參數(shù)的一種情況。

這種情況,在實際業(yè)務中,出現(xiàn)的頻率還是比較高的,因為存儲過程一般都是采用參數(shù)化的寫法,這時,遇到分布不均勻的數(shù)據(jù)參數(shù)時,parameter sniff現(xiàn)象就出現(xiàn)了,這種問題還是比較讓人頭疼的。

具體parameter sniff產(chǎn)生的原因,我就不做過多的解釋了,解釋這個就顯得太low了

我舉個簡單的例子,模擬一下這個現(xiàn)象,說明參數(shù)化的存存儲過程是怎么寫的,存在哪些問題,又如何解決parameter sniff問題,

先創(chuàng)建一個測試環(huán)境:

create table ParameterSniffProblem(id int identity(1,1),CustomerId int,OrderId int,OrederStatus int,CreateDate Datetime,Remark varchar(200))declare @i int = 0while @i<500000beginINSERT INTO ParameterSniffProblem values (@i%10000,@i,RAND()*10,GETDATE()-RAND()*100,NEWID())set @i=@i+1end--假如某一個客戶有非常多的訂單,模擬數(shù)據(jù)分布不均勻的情況INSERT INTO ParameterSniffProblem values (6666,RAND()*100000,1,GETDATE()-RAND()*100,NEWID())GO 100000--創(chuàng)建正常的索引CREATE CLUSTERED INDEX IDX_CreateDate on ParameterSniffProblem(CreateDate)CREATE INDEX IDX_CustomerId ON ParameterSniffProblem(CustomerId)

參數(shù)化存儲過程的寫法:

在編寫存儲過程的時候,我們一般建議采用參數(shù)化的寫法,目的是為了減少存儲過程的編譯和加強執(zhí)行計劃緩存的重用

大概是這樣子的

CREATE PROCEDURE [dbo].ParameterSniffTest ( @p_CustomerId int,@p_Status int,@p_FromDate datetime,@p_ToDate datetime) AS BEGINSET NOCOUNT ON DECLARE@Parm NVARCHAR(MAX),@sqlcommand NVARCHAR(MAX) = N''SET @sqlcommand = 'SELECT * FROM ParameterSniffProblem WHERE 1=1'     IF(@p_CustomerId IS NOT NULL)SET @sqlcommand = CONCAT(@sqlcommand,'AND CustomerId=@p_CustomerId ')IF(@p_Status IS NOT NULL)SET @sqlcommand = CONCAT(@sqlcommand,'AND OrederStatus=@p_Status ')IF(@p_FromDate IS NOT NULL)SET @sqlcommand = CONCAT(@sqlcommand,'AND CreateDate>=@p_FromDate ')IF(@p_ToDate IS NOT NULL)SET @sqlcommand = CONCAT(@sqlcommand,'AND CreateDate<=@p_ToDate ')    SET @Parm= '@p_CustomerId int,@p_Status   int,@p_FromDate  datetime,@p_ToDate   datetime '    EXEC sp_executesql @sqlcommand,@Parm,@p_CustomerId = @p_CustomerId,@p_Status = @p_Status,@p_FromDate = @p_FromDate,@p_ToDate = @p_ToDate ENDGO

Parameter Sniff問題:

這就潛在一個parameter sniff問題,

比如我查詢用戶ID=100的訂單信息,一個正常的分布的數(shù)據(jù),存儲過程第一次編譯,這個執(zhí)行計劃完全沒有問題,

sqlserver,parameter,sniff

如果我接著改變參數(shù)執(zhí)行查詢用戶6666的信息,一個分布及其不均勻的數(shù)據(jù),但是因為重用上面緩存的執(zhí)行計劃,就出現(xiàn)parameter sniff問題了,這個執(zhí)行計劃顯然是不合理的

IO就不看了,刻意造的例子

sqlserver,parameter,sniff

如果我清空執(zhí)行計劃緩存,重新執(zhí)行上述查詢,因為有了重編譯,執(zhí)行計劃就是不這個樣子,對于CustomerID=6666這個參數(shù)來說,顯然走全表掃描代價要更小一點

sqlserver,parameter,sniff

想必這是一個開發(fā)中常見的問題給,我們參數(shù)化SQL就是為了讓不同參數(shù)的查詢重用執(zhí)行計劃,但是很不幸,數(shù)據(jù)分布不均勻的時候,重用執(zhí)行計劃恰恰又給數(shù)據(jù)庫造成了傷害,例中,如果是正常參數(shù)重用了分布較多數(shù)據(jù)的執(zhí)行計劃,比如命名可以用到索引,結(jié)果是表掃描,后果會更嚴重。

那么,既想要盡可能的重用執(zhí)行計劃,又要避免因為執(zhí)行計劃重用產(chǎn)生parameter sniff問題,怎么辦?

我們知道問題在于@p_CustomerId身上,那么可不可以對有可能產(chǎn)生parameter sniff問題的@p_CustomerId不做參數(shù)化,直接拼湊在SQL中,如果@p_CustomerId變化了就重編譯SQL,也就是對傳入進來的@p_CustomerId重編譯

如果是@p_CustomerId不變,其他參數(shù)有變化,比如這里時間字段的變化,還可以享受參數(shù)化帶來的執(zhí)行計劃重用的好處 也就是這樣處理 @p_CustomerId這個參數(shù),直接把@p_CustomerId以字符串的方式平湊在SQL語句中,這樣的話,就相當于即席查詢了,不通過參數(shù)化的方式給CustomerId這個查詢條件字段賦值

IF(@p_CustomerId IS NOT NULL)SET @sqlcommand = CONCAT(@sqlcommand,'AND CustomerId= ',@p_CustomerId)

這樣再去執(zhí)行存儲過程的時候,

帶入@p_CustomerId=1的時候,執(zhí)行IDX_CustomerId的index seek

sqlserver,parameter,sniff

帶入@p_CustomerId=6666的時候,重編譯,執(zhí)行計劃是全表掃描,避免重用上面生成的執(zhí)行計劃,造成不合理的執(zhí)行方式對效率以及數(shù)據(jù)庫服務器資源的消耗

sqlserver,parameter,sniff

這樣會盡可能的減少parameter sniff問題帶來的影響,當緩存了@p_CustomerId=1的執(zhí)行計劃的時候,再次傳入@p_CustomerId=1,其他條件有較小的變化,比如時間字段上有改動,依然可以重用緩存的執(zhí)行計劃,避免重編譯帶來的影響

結(jié)論:

這種方式于處理parameter sniff問題,當然不是完美的,肯定也有問題,我當然知道一旦@p_CustomerId不同就要重編譯

肯定會因為@p_CustomerId參數(shù)值不同,這樣的話,不可避免地增加了重編譯的機會,

但是卻不會因為不合理的執(zhí)行計劃重用,帶來的parameter sniff問題

要知道一旦產(chǎn)生parameter sniff問題,大量的查詢用到不合理的執(zhí)行計劃,會對整個服務器產(chǎn)生非常嚴重的影響,比如可能會產(chǎn)生大量的IO等

同時存在一個好處,比如第一次傳入@p_CustomerId=1,

再次傳入@p_CustomerId=1,其他條件有較小的變化,比如時間字段上有改動,依然可以重用緩存的執(zhí)行計劃,避免重編譯帶來的影響當然我這里只是一個簡單的例子,實際應用中遠遠比這個復雜

比如分布的特別的多的數(shù)據(jù)有兩個特點,第一分布的標示不僅僅只有一個,第二分布不均的數(shù)據(jù)是動態(tài)的,有可能第一季度是A這部分數(shù)據(jù)占據(jù)大多數(shù),有可能是第二季度B數(shù)據(jù)占絕大多數(shù)

所以很難采用Plan Guide的方式解決parameter sniff問題

這種方式可以在一定程度上也能夠重用緩存的執(zhí)行計劃,可以減少(但不可避免)重編譯的次數(shù)

同時,這種方式與拼湊一個SQL字符串執(zhí)行的即席查詢方式相比,同時還可以利用參數(shù)化帶來的其他好處,比如SQL注入等等

總結(jié):

    parameter sniff問題的解決方式有很多,不一一啰嗦了

    最典型的就是強制重編譯,

    或者使用EXEC執(zhí)行一個拼湊出來的字符串,這種方式屬于Adhoc查詢

    或者查詢提示,

    或者是使用本地變量,

      或者使用Plan Guide等等等等,

    每種方式都有他的局限性,至少到目前為止,還沒有一種十全十美的方式來解決parameter sniff問題

    遇到問題,解決方法有很多種,以最小的代價解決問題才是王道。

 

注:相關教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
蜜臀尤物一区二区三区直播| 欧美网色网址| 久久www成人_看片免费不卡| 亚洲天堂成人在线| 日韩欧美看国产| 少妇视频在线观看| 欧美亚洲高清一区二区三区不卡| 在线国产福利网站| 亚洲国产精品99久久久久久久久| 色999五月色| 亚洲天堂av老司机| 亚洲人成网站影音先锋播放| 91在线视频国产| 国产精品男女猛烈高潮激情| 初高中福利视频网站| av理论在线观看| 精品高清美女精品国产区| 调教+趴+乳夹+国产+精品| 在线播放一区二区精品产| 综合天天久久| 污视频在线免费观看| 天天躁日日躁狠狠躁av麻豆男男| 精品亚洲一区二区三区四区五区高| 日韩毛片在线免费观看| 亚洲毛片一区二区三区| 久久精品国产亚洲高清剧情介绍| 自慰无码一区二区三区| 神马久久午夜| 天天影院图片亚洲| 国产日本韩国在线播放| 国产婷婷视频在线| 99色在线播放| 87福利电影网| 台湾亚洲精品一区二区tv| 毛片在线视频| 天堂网在线中文| 欧美精品精品精品精品免费| 色综合久久久久综合99| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美中文在线观看国产| 亚洲精品国产精品国自产| 国产成人亚洲精品播放器下载| 国内免费精品视频| 黄色欧美在线| 视频一区 中文字幕| 美女av一区二区三区| 日韩毛片在线观看| 91久色porny| 欧美在线免费观看| 3d精品h动漫啪啪一区二区| 国产人成一区二区三区影院| 日韩久久久久久久久久久久久| 欧美激情午夜| 26uuu精品一区二区| 欧美黑人巨大xxx极品| 一区二区三区视频在线免费观看| 免费看日产一区二区三区| 999精品在线观看| 后入内射无码人妻一区| 亚洲丝袜一区| 欧美日韩精品一区二区三区在线观看| 久久久久亚洲av无码网站| www.黄色一片| 国产精品一区二区91| 伊人国产精品视频| 99免在线观看免费视频高清| 国产91视频一区| 日本激情一区| 天堂俺去俺来也www久久婷婷| 伦伦影院午夜日韩欧美限制| jizz亚洲| 亚洲国产精品久久久久婷婷软件| 亚洲精品美女在线观看| 麻豆国产精品一区二区三区| 欧美,日韩,国产在线| 性久久久久久久久| 免费男女羞羞的视频网站中文字幕妖精视频| 欧美日韩一级黄| 伊人精品久久久久7777| 露脸国产精品自产在线播| bbbbbbbbbbb在线视频| av在线收看| 午夜黄色小视频| 欧美精品黄色| 色综合久久久久网| 欧美日韩另类字幕中文| 精品免费日韩av| 青青草91久久久久久久久| 高清精品视频| 秋霞成人午夜鲁丝一区二区三区| 国产女人18毛片水18精| 西西大胆午夜视频| 香蕉视频官网在线观看日本一区二区| 国产精品高潮呻吟久久| 青青青免费视频观看在线| 艳母动漫在线观看| 日韩视频免费观看高清完整版在线观看| 在线观看91精品国产麻豆| h网址在线观看| 欧美精品人人做人人爱视频| 午夜一级在线看亚洲| 99在线免费视频| 午夜日韩在线电影| 91亚洲永久精品| 色大师av一区二区三区| bdsmchinese医疗折磨| 欧美一区二区三区在线播放| 狠狠色综合久久婷婷| 日韩美女一级视频| 丰满的亚洲女人毛茸茸| 亚洲色图一区二区| 美国毛片一区二区| 国产二区在线播放| 久久久无码人妻精品无码| 日韩在线观看电影完整版高清免费悬疑悬疑| 欧美日韩免费观看一区=区三区| 亚洲午夜电影网| 免费毛片一区二区三区久久久| 日韩精品极品视频| 91.麻豆视频| 国产激情网址| 成人爽a毛片一区二区| 欧美刺激午夜性久久久久久久| 国产欧美日韩视频一区二区| 最近中文视频在线| 奇米影视第四狠狠777| 亚洲天堂av中文字幕| 日韩欧美中文字幕在线播放| 午夜精品久久久久99蜜桃最新版| 国模吧一区二区| 亚洲乱码国产乱码精品精软件| 在线视频亚洲自拍| 国产精品久久久久久免费播放| 精品一区二区三区蜜桃在线| 日本福利视频导航| 亚洲区小说区图片区qvod按摩| 成人久久久久久久久| 中文字幕人成人乱码| 18成人免费观看网站下载| 中文字幕一区二区三区域| 色吊丝中文字幕| 91传媒免费观看| 久久av资源站| 亚洲免费观看高清完整版在线观看熊| 日韩av在线电影网| 国产天堂在线| 992tv国产精品成人影院| 国产大陆精品国产| 最新国产精品精品视频| 日本一级片在线播放| 中文字幕中文在线不卡住| 中文字幕精品一区二区三区在线| 一区二区三区的久久的视频| 毛片网站在线| 国产伦久视频在线观看| 国产一区二区精品免费| 拔插拔插华人永久免费| 亚洲欧美制服另类日韩| 日韩欧美国产一区二区三区| 青青草成人激情在线| √天堂资源地址在线官网| 欧美一区国产一区| 国产精品区免费视频| 精品国产一区二区三区久久| 免费毛片a线观看| 女教师淫辱の教室蜜臀av软件| **爰片久久毛片| 99久久亚洲一区二区三区青草| av在线麻豆| 午夜精品视频| 噜噜噜噜噜久久久久久91| 少妇高潮喷水久久久久久久久久| 亚洲国产成人精品激情在线| 免费偷拍视频网站| 日韩欧美一级| 日韩毛片一区| 绯色av一区| 一区二区三区视频在线观看免费| 国产午夜精品一区理论片飘花| 99国产精品一区| 1024视频在线| 麻豆影视在线观看_| 高清无码视频直接看| 日韩欧美色视频| 久久久久久无码精品大片| 999国产精品亚洲77777| 亚洲国产精品久久久男人的天堂| 国产一区二区三区在线免费| 精品午夜福利在线观看| 天堂99x99es久久精品免费| 红杏一区二区三区| 欧美最猛性xxxxx直播| 欧美日韩123区| 亚洲欧洲精品一区二区三区不卡| 日韩精品高清不卡| 日韩成人免费视频| 婷婷六月激情| 久久视频一区二区三区| 国产精品久久久久久亚洲色| 亚洲欧美日韩不卡| 日韩精品视频中文在线观看| 高清不卡一区二区三区| 亚在线播放中文视频| 亚洲国产美女| 日本丰满少妇一区二区三区| 成人免费无遮挡| 久久精品视频中文字幕| 99国产揄拍国产精品| 免费在线观看的av| 欧美视频久久久| 国产精品视频在线播放| 538国产精品一区二区在线| 国产一区二区不卡老阿姨| 日本日本精品二区免费| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲精选一区二区| 国产精品视频区| 亚洲欧美一区二区三区情侣bbw| 亚洲欧美精品一区二区三区| 免费xxxx性欧美18vr| 久久青青草原亚洲av无码麻豆| 欧美国产在线看| 亚欧黄色av| 国产精品欧美大片| 国产精品三级视频| 日本边添边摸边做边爱的第三级| 在线播放免费| 亚洲国产成人av网| 欧美激情www| 又黄又爽毛片免费观看| 91成人免费网站| 成人免费区一区二区三区| 国产麻豆a毛片| 激情五月综合婷婷| 国产欧美精品一区二区三区四区| 成人午夜激情影院| 免费av在线一区| 日韩精品免费一区二区夜夜嗨| 欧美黄色片在线观看| 麻豆av一区二区| 在线丨暗呦小u女国产精品| www.91视频| 99精品视频网站| 欧美黄色高清视频| 色综合老司机第九色激情| 欧美一区2区视频在线观看| 欧美日韩国产一二三| 国产精品自拍网站| 欧美人交a欧美精品| jizzjizzjizzjizzjizzjizzjizz| 蝌蚪91视频| 欧美h视频在线观看| 国产福利在线视频| 国产精品久久久99| 女人让男人操自己视频在线观看| 在线成人综合色一区| 黄色成人在线观看网站| 亚洲欧美偷拍另类| 欧美精品一区在线| 天天干,天天干| 亚洲国产国产亚洲一二三| 亚洲精品天堂在线观看| 国产福利免费在线观看| 亚洲精品无码专区在线播放| 1024av视频| 黄色录像a级片| 亚洲欧洲国产伦综合| 国产视频精品免费播放| 日本在线视频www色| 91国偷自产中文字幕久久| 精品深夜av无码一区二区老年| 国产一级黄色| 私拍精品福利视频在线一区| 91污片在线观看| 一区二区日韩| 综合激情网五月| 国产欧美视频一区二区三区| 亚洲黄色在线免费观看| 日韩理论片久久| av影片免费在线观看| 国产一区二区三区免费观看| 欧美激情久久久| 男人的天堂va免费视频| 亚洲精品国产精品自产a区红杏吧| 亚洲人成免费电影| 精品免费av一区二区三区| 中文字幕一区日韩电影| av在线一区二区三区| 午夜电影网亚洲视频| 日韩视频 中文字幕| 都市激情亚洲欧美| 丁香花免费高清完整在线播放| 日韩视频在线永久播放| 水莓100在线视频| 国产美女激情视频| 欧美噜噜久久久xxx| 黄色亚洲免费| 欧美一区第一页| 欧美一级视频免费| 懂色av粉嫩av蜜臀av一区二区三区| 性网站在线播放| 日韩精品午夜| 欧美人与性动交α欧美精品济南到| 精品在线播放免费| 欧美aⅴ99久久黑人专区| 国产精品久久77777| 成人中文字幕在线| 亚洲桃花岛网站| 91欧美一区二区三区| 真实国产乱子伦对白在线| 午夜精品一区二区三区电影天堂| 99热这里只有精品2| 91成人在线观看喷潮| 精品国产91久久久久久久妲己| 午夜久久久久久久久久| 黄页网站大全一区二区| 嫩草影院入口一二三免费| 国产精品96久久久久久| 懂色av粉嫩av蜜臀av| 黄色一级大片在线免费看产| 综合激情一区| 人妻体内射精一区二区| 美女国产在线| 久久综合久久色| 亚洲一级电影| 狠狠躁夜夜躁人人爽视频| 女同另类激情重口| 精品成av人一区二区三区|