婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQL Server中參數化SQL寫法遇到parameter sniff ,導致不合理執行計劃重用的快速解決方法

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

熱門標簽:零成本地圖標注賺錢 安卡拉地圖標注app 千呼電話機器人可以試用嗎 互聯網電話外呼系統 電銷需要外呼系統嗎 家庭農場地圖標注名稱怎樣起名 電話機器人怎么代理商 400電話辦理泰安 我要地圖標注數量有限制嗎

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

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

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

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

先創建一個測試環境:

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

參數化存儲過程的寫法:

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

大概是這樣子的

CREATE PROCEDURE [dbo].ParameterSniffTest 
( 
@p_CustomerId int,
@p_Status int,
@p_FromDate datetime,
@p_ToDate datetime
) 
AS 
BEGIN
SET 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 
END
GO

Parameter Sniff問題:

這就潛在一個parameter sniff問題,

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

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

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

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

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

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

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

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

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

這樣再去執行存儲過程的時候,

帶入@p_CustomerId=1的時候,執行IDX_CustomerId的index seek

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

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

結論:

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

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

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

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

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

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

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

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

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

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

總結:

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

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

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

    或者查詢提示,

    或者是使用本地變量,

      或者使用Plan Guide等等等等,

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

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

您可能感興趣的文章:
  • 淺析SQL Server 聚焦索引對非聚集索引的影響
  • MySQL中主鍵索引與聚焦索引之概念的學習教程
  • SQLSERVER中得到執行計劃的兩種方式
  • SqlServer 執行計劃及Sql查詢優化初探
  • 淺析SQL Server中的執行計劃緩存(下)
  • 淺析SQL Server中的執行計劃緩存(上)
  • 強制SQL Server執行計劃使用并行提升在復雜查詢語句下的性能
  • 淺析SQL Server的聚焦使用索引和查詢執行計劃

標簽:池州 來賓 東營 新鄉 濱州 大同 黃山 文山

巨人網絡通訊聲明:本文標題《SQL Server中參數化SQL寫法遇到parameter sniff ,導致不合理執行計劃重用的快速解決方法》,本文關鍵詞  SQL,Server,中,參數,化,寫法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL Server中參數化SQL寫法遇到parameter sniff ,導致不合理執行計劃重用的快速解決方法》相關的同類信息!
  • 本頁收集關于SQL Server中參數化SQL寫法遇到parameter sniff ,導致不合理執行計劃重用的快速解決方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人一级片在线观看| 天天做天天摸天天爽国产一区| 欧美日韩亚州综合| 午夜久久久久久| 中文字幕av免费专区久久| 欧洲色大大久久| 不卡大黄网站免费看| 久久av资源站| 午夜电影一区二区三区| 亚洲欧美一区二区三区极速播放 | 美女视频黄频大全不卡视频在线播放| 亚洲天堂网中文字| 亚洲国产电影在线观看| 日韩免费看的电影| 欧美一区二区三区人| 色婷婷综合久久久久中文| 成人av电影在线网| av网站一区二区三区| 国产乱码精品一区二区三区忘忧草 | 蜜臀久久99精品久久久久久9| 日韩欧美高清dvd碟片| 在线观看视频欧美| 91亚洲男人天堂| 91国偷自产一区二区使用方法| 国产麻豆精品视频| 国产激情精品久久久第一区二区| 国产成人aaa| 欧美96一区二区免费视频| 久久99精品国产91久久来源| 精品国产乱码久久久久久夜甘婷婷 | 亚洲欧美日韩一区二区| 欧美xxxx老人做受| 欧美tk—视频vk| 成人精品国产免费网站| 九九在线精品视频| 欧美日韩一区三区| 欧美午夜宅男影院| 欧美日韩国产综合一区二区三区| 欧美亚洲国产bt| 欧美男人的天堂一二区| 欧美精品一二三区| 欧美精品一区二区蜜臀亚洲| 国产午夜精品在线观看| 国产精品美女久久久久久2018| 中文字幕一区二区三区在线不卡| 亚洲日本青草视频在线怡红院 | 亚洲精品一区在线观看| 精品91自产拍在线观看一区| 久久久久亚洲蜜桃| 国产精品久久久久久久久晋中| 亚洲激情第一区| 久久精品99国产精品日本| 国产尤物一区二区在线| 91免费看片在线观看| 欧美电影影音先锋| 久久久国产精品麻豆| 亚洲色图在线播放| 蜜臀av一级做a爰片久久| 成人小视频在线| 欧美日韩国产成人在线免费| 久久久www成人免费毛片麻豆| 中文字幕综合网| 美女视频第一区二区三区免费观看网站 | 成人在线视频一区二区| 欧美色倩网站大全免费| 国产拍揄自揄精品视频麻豆| 午夜久久久久久| 豆国产96在线|亚洲| 欧美日韩成人综合天天影院 | 国产人成一区二区三区影院| 亚洲国产中文字幕| 成人av中文字幕| 欧美一级日韩免费不卡| 国产精品丝袜一区| 国产麻豆午夜三级精品| 4438亚洲最大| 亚洲综合色在线| 成人三级伦理片| 日韩免费福利电影在线观看| 亚洲成人av资源| 91日韩在线专区| 国产精品久久久久婷婷二区次| 日本不卡一区二区三区| 色国产精品一区在线观看| 国产精品全国免费观看高清 | 美女一区二区三区| 欧美日韩中字一区| 亚洲精品视频在线| 99久久国产综合精品女不卡| 久久久亚洲午夜电影| 美女视频第一区二区三区免费观看网站| 色久优优欧美色久优优| 亚洲欧洲韩国日本视频| 成人av集中营| 国产精品私人影院| 粉嫩欧美一区二区三区高清影视 | 国产99久久久国产精品潘金网站| 777午夜精品视频在线播放| 亚洲夂夂婷婷色拍ww47| 欧洲av在线精品| 成人av资源站| 国产精品欧美一区喷水| 成人小视频在线| 国产精品美女久久福利网站| 国产盗摄女厕一区二区三区| 国产午夜精品一区二区| 国产精品亚洲一区二区三区妖精| 欧美一区二区三区男人的天堂| 午夜成人在线视频| 欧美一区二区成人6969| 九九热在线视频观看这里只有精品| 日韩一区二区在线观看视频 | 国产精品素人视频| 成人久久视频在线观看| 国产欧美日韩三区| 99久久精品国产一区| 一区二区三区色| 91麻豆精品国产自产在线观看一区| 日韩国产精品久久久| 精品乱码亚洲一区二区不卡| 韩国女主播成人在线观看| 欧美激情中文不卡| 色综合久久88色综合天天免费| 91精品国产综合久久蜜臀| 美女视频免费一区| 国产欧美日本一区视频| 91美女蜜桃在线| 日本不卡视频一二三区| 欧美国产精品久久| 欧美午夜精品一区| 九一九一国产精品| 中文字幕一区日韩精品欧美| 国产精品久久免费看| 精品视频在线免费| 美日韩一级片在线观看| 欧美精品一区二区三区蜜桃| 日韩电影在线一区| 国产精品福利一区| 国产精品视频一二| 香蕉乱码成人久久天堂爱免费| 国产精品国产三级国产| 337p亚洲精品色噜噜噜| 久久奇米777| 国产精品每日更新| 亚洲一区中文日韩| 老司机精品视频一区二区三区| 国产乱子轮精品视频| 95精品视频在线| 久久精品视频网| 亚洲一二三专区| 捆绑调教美女网站视频一区| 久久国产人妖系列| 欧美伊人久久久久久午夜久久久久| 欧美肥妇bbw| 五月综合激情婷婷六月色窝| 国产盗摄女厕一区二区三区| 在线看日本不卡| 自拍偷在线精品自拍偷无码专区| 美女在线一区二区| 宅男噜噜噜66一区二区66| 一区二区三区四区激情| 96av麻豆蜜桃一区二区| 国产精品欧美一区喷水| 风间由美中文字幕在线看视频国产欧美 | 精品噜噜噜噜久久久久久久久试看| 一区二区三区**美女毛片| 91老司机福利 在线| 久久99这里只有精品| 中文字幕五月欧美| 3d动漫精品啪啪一区二区竹菊| 一区二区三区高清在线| 欧美一区永久视频免费观看| 美脚の诱脚舐め脚责91| 亚洲精品国产精华液| 日韩免费视频线观看| 在线看国产一区| 91视频在线观看免费| 中文字幕中文字幕一区二区| 在线国产电影不卡| 国产精品 欧美精品| 一区二区久久久久久| 国产精品乱人伦一区二区| 色综合视频一区二区三区高清| 中文字幕一区二区三区四区| 欧美不卡一区二区三区四区| 国产一区二区三区日韩 | 久久日一线二线三线suv| 国产精品伦理一区二区| 蜜桃av一区二区在线观看| 亚洲精品一区二区三区99| 在线区一区二视频| 亚洲三级在线免费观看| 在线观看亚洲精品| 欧美午夜理伦三级在线观看| 亚洲女爱视频在线| 欧美三级午夜理伦三级中视频| 一本久久精品一区二区| 国产精品毛片久久久久久 | 国产999精品久久久久久绿帽| 美日韩一级片在线观看|