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

首頁 > 開發 > 綜合 > 正文

參數嗅探(Parameter Sniffing)(2/2)

2024-07-21 02:46:48
字體:
來源:轉載
供稿:網友
參數嗅探(Parameter Sniffing)(2/2)

在參數嗅探(Parameter Sniffing)(1/2)里,我介紹了SQL Server里參數嗅探的基本概念和背后的問題。如你所見,當緩存的計劃被SQL Server盲目重用時,會帶來嚴重的性能問題。今天我會向你展示下如何處理這個問題,即使用不同的技術克服它。

索引(Index)

上次我們討論造成參數嗅探問題的根源是:在執行計劃里,SQL 語句有時會產生書簽查找,有時會產生表/聚集索引掃描。如果你能在數據庫里修改索引,解決這個問題的最簡單方法就是提供查詢列對應的覆蓋非聚集索引。這里我們就要包含書簽查找的需要列,在非聚集索引的葉子層。這樣做后,就可以獲得計劃穩定性:不管提供的輸入任何參數,查詢優化器都可以編譯同樣的執行計劃——這里就是都會用到索引查找(非聚集索引)運算符。

1 DROP  INDEX idx_Test ON Table12 CREATE NONCLUSTERED INDEX idx_Test ON Table1(Column2) INCLUDE(Column1)3 4 SELECT * FROM dbo.Table1 WHERE Column2=15 SELECT * FROM dbo.Table1 WHERE Column2=2

如果你不能修改你的索引設計,可以嘗試下面的方法:

重編譯(Recompilation)

SQL Server提供給你的第一個選項是執行計劃的重編譯。它提供2個不同選項給你使用:

  • 全部重編譯,整個存儲過程
  • 有問題的SQL語句重編譯,即所謂的語句級別的重編譯(從SQL Server 2005起可用)

我們通過實例詳細講解下這2個選項。下面的語句會對整個存儲過程進行重編譯:

 1 -- Create a new stored PRocedure for data retrieval 2 CREATE PROCEDURE RetrieveDataR 3 ( 4     @Col2Value INT 5 ) 6 WITH RECOMPILE 7 AS 8     SELECT * FROM Table1 9     WHERE Column2 = @Col2Value10 GO

當你執行這樣的存儲過程時,查詢優化器在每次執行前都會重新編譯存儲過程。因此你得到的執行計劃都是基于目前輸入的參數值。作為重編譯的副作用,你的執行計劃不會被緩存,對于一個每次都重編譯的執行計劃進行緩存是沒有意義的。當你有一個大的復雜的存儲過程在存儲過程級別使用RECOMPILE選項,這樣做就沒太大意義,因為你的整個存儲每次都重編譯,而存儲過程就是為了編譯好進行重用,從而提高執行效率。

1 EXEC dbo.RetrieveDataR @Col2Value = 1 -- int2 EXEC dbo.RetrieveDataR @Col2Value = 2 -- int

如果你的參數嗅探問題只出現在一個特定的SQL語句。那就沒有必要對整個存儲過程進行重編譯了。因此從SQL Server2005開始,提供稱為語句級別的重編譯(Statement Level Recompilation) 。你可以對需要重編譯的SQL語句加上RECOMPILE查詢提示而不是整個存儲過程。我們來看下下面的代碼:

 1 -- Create a new stored procedure for data retrieval 2 CREATE PROCEDURE RetrieveDataR2 3 ( 4     @Col2Value INT 5 ) 6 AS 7     SELECT * FROM Table1 8     WHERE Column2 = @Col2Value 9 10         SELECT * FROM Table111     WHERE Column2 = @Col2Value12         OPTION (RECOMPILE)13 GO

上述例子里的第2個SQL語句在存儲過程執行的時候都會重編譯。第1個語句在執行初始時編譯好,并生成計劃緩存做后續重用。在你不想修改數據庫的索引時,這個方法是處理參數嗅探的推薦方法。

1 EXEC dbo.RetrieveDataR2 @Col2Value = 2 -- int

OPTIMIZE FOR

除了存儲過程或SQL語句的重編譯查詢提示,SQL Server也提供OPTIMIZE FOR的查詢提示。用這個查詢提示你可以告訴查詢優化器哪個參數值下,對執行計劃執行優化,我們看下面的例子:

 1 -- Create a new stored procedure for data retrieval 2 CREATE PROCEDURE RetrieveDataOF 3 ( 4     @Col2Value INT 5 ) 6 AS 7     SELECT * FROM Table1 8     WHERE Column2 = @Col2Value 9         OPTION (OPTIMIZE FOR (@Col2Value = 1))10 GO

從存儲過程的定義中你可以看到,SQL語句的執行計劃在參數@Col2Value值為1的時候需要進行優化。不管你提供給這個參數的任何值,你都獲得為值1優化的編譯計劃。用這個方法你已經對SQL Server放大招了,因為查詢優化器沒別的選項——它必須為參數值1生成優化的的執行計劃。當你知道查詢計劃需要為指定參數進行優化時,可以使用這個方法讓SQL Server對此參數的執行計劃進行優化。在你重啟SQL Server或執行群集故障轉移時,就可以預知你的執行計劃。

為了進一步保障這個選項的有效性,你就要熟悉你的數據分布情況,還有什么時候數據分布情況會改變。如果數據分布情況已經改變,你就要修改查詢提示,看看是否仍然合適。你不能完全相信查詢優化器,因為你已經用OPTIMIZE FOR查詢提示重置查詢優化器的選擇。要記住這個。另外在提供OPTIMIZE FOR查詢提示的同時,SQL Server也提供OPTIMIZE FOR UNKNOWN查詢提示。如果你決定使用OPTIMIZE FOR UNKNOWN查詢提示,查詢優化器就使用表統計信息里的密度來做參數預估。如果邏輯讀超過了臨界點,還是會使用表/索引掃描……

小結

在這個文章里我向你展示在SQL Server里處理參數嗅探問題的不同方式。其中造成這個問題的最常見原因是糟糕的索引設計,造成參數值傳入后優化器在執行計劃里選擇了書簽查找。如果這樣的執行計劃被緩存重用的話,你的I/O成本就會爆表。在生成環境中,我就看到因為這個原因就造成100GB的邏輯讀。在SQL語句上加一個簡單的RECOMPILE查詢提示就可以解決這個問題,查詢只會增加少量的邏輯讀。

如果你不能修改數據庫索引設計,你可以在存儲過程或SQL語句上使用RECOMPILE查詢提示。作為副作用編譯的計劃就不會緩存。除此外的查詢提示,SQL Server還提供OPTIMIZE FOROPTIMIZE FOR UNKNOWN的查詢提示。在你使用這些查詢提示時,你要對你的數據和數據分布情況非常熟悉,因為你在重置優化器。請慎重使用!Be always aware of this fact!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人一区在线| 热久久99这里有精品| 亚洲欧美激情精品一区二区| 欧美午夜宅男影院在线观看| 中文字幕在线视频日韩| 欧洲美女7788成人免费视频| 亚洲免费av片| 国产精品黄色影片导航在线观看| 精品一区二区三区三区| 欧美激情a∨在线视频播放| 欧美精品九九久久| 亚洲视频视频在线| 日韩经典中文字幕| 日本午夜精品理论片a级appf发布| 亚洲人成网站999久久久综合| 亚洲视频第一页| 亚洲午夜久久久影院| 久久久久久久久久久久久久久久久久av| 日韩精品中文字幕有码专区| 性欧美亚洲xxxx乳在线观看| 久久精品在线视频| 日韩激情视频在线播放| 成人亚洲欧美一区二区三区| 岛国视频午夜一区免费在线观看| 51久久精品夜色国产麻豆| 国产精品国模在线| 福利一区福利二区微拍刺激| 97精品国产aⅴ7777| 日韩av影片在线观看| 精品国产精品自拍| 精品福利在线观看| 中文字幕欧美亚洲| 国产精品亚洲激情| 黄色91在线观看| 777国产偷窥盗摄精品视频| 欧美成人免费在线观看| 中文字幕亚洲欧美| 国产成人中文字幕| 久久久久久亚洲精品| 久久全球大尺度高清视频| 久久艹在线视频| 91精品国产乱码久久久久久蜜臀| 一区二区三区 在线观看视| 美女扒开尿口让男人操亚洲视频网站| 日韩电影第一页| 一区二区三区黄色| 欧美激情在线狂野欧美精品| 2019中文字幕在线免费观看| 国内伊人久久久久久网站视频| 国产精品视频一区二区三区四| 欧美亚洲一区在线| 久久久久久久久亚洲| 亚洲激情视频网| 中文字幕久热精品视频在线| 国产日韩欧美在线播放| 亚洲最新视频在线| 久久天天躁狠狠躁夜夜爽蜜月| 国产在线精品播放| 欧美久久久精品| 国产亚洲精品久久| 国产精品亚洲综合天堂夜夜| 性色av一区二区三区红粉影视| 国产精品亚洲视频在线观看| 久久成人在线视频| 成人在线免费观看视视频| 久久久999国产| 国产原创欧美精品| 亚洲精品美女在线观看| 国产成人aa精品一区在线播放| 在线电影中文日韩| 亚洲国产精品久久| 精品色蜜蜜精品视频在线观看| 欧美午夜精品久久久久久久| 91精品国产色综合| 久久精品99国产精品酒店日本| 精品日本美女福利在线观看| 国产极品jizzhd欧美| 亚洲欧洲在线看| 精品国产欧美一区二区三区成人| 精品国产乱码久久久久久虫虫漫画| 国产主播在线一区| 欧美日韩亚洲激情| 国产精品精品视频一区二区三区| 国产精品人成电影| 日韩精品在线观看网站| 国产精品高潮视频| 91老司机在线| 性欧美办公室18xxxxhd| 国产亚洲精品高潮| 亚洲欧美激情精品一区二区| 欧美精品精品精品精品免费| 亚洲欧洲日产国码av系列天堂| 啪一啪鲁一鲁2019在线视频| 韩日精品中文字幕| 亚洲成人在线网| 国产精品福利网| 亚洲国产私拍精品国模在线观看| 久久久久久久电影一区| 九九久久久久99精品| 日韩av在线看| 51午夜精品视频| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产精品高清久久久| 亚洲人成网站免费播放| 国内精品久久久久影院优| 夜夜嗨av色综合久久久综合网| 日韩av电影中文字幕| 久久精品一区中文字幕| 国产精品视频播放| 亚洲一区亚洲二区| 日韩中文字幕在线视频播放| 91大神在线播放精品| 亚洲精品一区中文字幕乱码| 人人爽久久涩噜噜噜网站| 国产精品久久久久久搜索| 亚洲午夜未满十八勿入免费观看全集| 国产精品6699| 福利视频导航一区| 日韩有码视频在线| 国产va免费精品高清在线| 中文字幕亚洲情99在线| 欧美做受高潮电影o| 久久久久久久久久久人体| 国产免费一区二区三区在线能观看| 中文字幕在线精品| xvideos亚洲人网站| 亚洲国产精品99| 亚洲精品色婷婷福利天堂| 91高清免费视频| 亚洲欧洲自拍偷拍| 亚洲男人天堂古典| 最近2019中文字幕第三页视频| 欧美午夜美女看片| 日韩欧美在线免费观看| 亚洲视频电影图片偷拍一区| 亚洲国产高清高潮精品美女| 欧美日韩性生活视频| 日韩女优人人人人射在线视频| 亚洲第一视频网站| 成人久久一区二区三区| 国产一区二区视频在线观看| 色妞在线综合亚洲欧美| 欧美福利视频在线| 色哟哟网站入口亚洲精品| 欧美大片在线影院| 日韩精品亚洲元码| 51精品国产黑色丝袜高跟鞋| 午夜精品一区二区三区在线播放| 超碰91人人草人人干| 九九热99久久久国产盗摄| 俺去亚洲欧洲欧美日韩| 亚洲精品少妇网址| 欧美在线国产精品| 欧美性受xxx| 国产噜噜噜噜久久久久久久久| 国产性猛交xxxx免费看久久| 亚洲精品aⅴ中文字幕乱码| 日韩精品在线私人| 欧美猛男性生活免费| 欧美一区第一页| 亚洲激情国产精品| 91久久久精品| 欧美人交a欧美精品| 国产亚洲欧美aaaa|