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

首頁 > 數據庫 > SQL Server > 正文

我如何調優SQL Server查詢

2024-08-31 00:54:08
字體:
來源:轉載
供稿:網友
我如何調優SQL Server查詢

我是個懶人,我只想干盡可能少的活。當我干活的時候我不想太多。是,你沒看錯,這看起來很糟糕,作為一個DBA這很不合格。但在今天的文章里,我想給你展示下,當你想對特定查詢創建索引設計時,你如何把你的工作和思考過程傳達給查詢優化器。聽起來很有意思?嗯,那就進入我的索引調優世界吧!

有問題的查詢

我們來看下列查詢:

 1 DECLARE @i INT = 999 2 SELECT 3     SalesOrderID,  4     SalesOrderDetailID, 5     CarrierTrackingNumber,  6     OrderQty,  7     LineTotal 8 FROM Sales.SalesOrderDetail 9 WHERE PRoductID < @i10  ORDER BY CarrierTrackingNumber11  GO

如你所見,這里用了一個本地變量與一個不等于謂語來從Sales.SalesOrderDetail表來獲取一些記錄。當你執行那個查詢,看它的執行計劃時,你會發現它有一些嚴重的問題:

  • SQL Server需要掃描Sales.SalesOrderDetail表的整個非聚集索引,因為沒有支持的非聚集索引。對這個掃描,查詢需要1382個邏輯讀,運行時間近800毫秒。
  • 查詢優化器在查詢計劃里引入了篩選器(Filter)運算符,它進行逐行比較用來檢查符合的行(ProductID < @i
  • 因為ORDER BY CarrierTrackingNumber,在執行計劃里一個排序(Sort)運算符被引入。
  • 排序運算符蔓延到了TempDb,因為不正確的基數計算(Cardinality Estimation)。用了帶了本地變量與不等于謂語的組合,SQL Server從表的基數硬碼估計30%的行。在我們的情況里估計行數是36395(121317 * 30%)。實際上查詢返回120621行,這意味這排序(Sort)運算符必須蔓延到TempDb,因為請求的內存授予太小了。

現在我問你——你能改善這個查詢么?你的建議是什么?休息下,想個幾分鐘。不修改查詢本身,你如何改善這個查詢?

我們來調試查詢!

當然,我們要做索引相關的調整來改善。沒有支持的非聚集索引,那只能是查詢優化器唯一可以使用計劃來運行我們的查詢。但對這個指定查詢,什么是好的非聚集索引呢?一般來說,我通過看搜索謂語來考慮可能的非聚集索引。在我們的例子里,搜索謂語如下:

WHERE ProductID < @i

我們請求在ProductID列過濾的行。因此我們想在那個列創建支持的非聚集索引。我們建立索引:

1 CREATE NONCLUSTERED INDEX idx_Test ON Sales.SalesOrderDetail(ProductID)2 GO

在非聚集索引創建后,我們需要驗證下改變,因此我們再次執行剛才的查詢代碼。結果如何捏?查詢優化器并沒有使用我們剛創建的非聚集索引!我們在搜索謂語上創建了支持的非聚集索引,查詢優化器沒有引用它?通常人們對此就無轍了。其實我們可以提示查詢優化器來使用非聚集索引,來更好的理解“為什么”查詢優化器沒有自動選擇索引:

 1 DECLARE @i INT = 999 2  3 SELECT 4     SalesOrderID,  5     SalesOrderDetailID, 6     CarrierTrackingNumber,  7     OrderQty,  8     LineTotal 9 FROM Sales.SalesOrderDetail WITH (INDEX(idx_Test))10 WHERE ProductID < @i11  ORDER BY CarrierTrackingNumber12  GO

當你現在看執行計劃時,你會看到下列的野性——一個并行計劃:

查詢花費了370109個邏輯讀!運行時間基本和剛才的一樣。這里到底發生了什么?當你仔細看執行計劃,你會發現查詢優化器引入了書簽查找,因為剛才創建的非聚集索引,對于查詢來說,不是一個覆蓋非聚集索引。查詢越過了所謂的臨界點(Tipping Point),因為我們用當前的搜索謂語來獲得幾乎所有行。因此用非聚集索引和書簽查找來組合沒有意義。

不去想為什么查詢優化器不選擇剛才創建的非聚集索引,我們已經把自己的思路表達給了查詢優化器本身,通過查詢提示進行了詢問了查詢優化器,為什么非聚集索引沒被自動選擇。如我剛開始說的:我不想考慮太多。

使用非聚集索引解決這個問題,在非聚集索引的葉子層,我們必須對從SELECT列表的請求的額外列進行包含。你可以再次看下書簽查找來看下在葉子層哪些列當前丟失:

  • CarrierTrackingNumber
  • OrderQty
  • UnitPrice
  • UnitDiscountPrice

我們重建那個非聚集索引:

1 CREATE NONCLUSTERED INDEX idx_Test ON Sales.SalesOrderDetail(ProductID)2 INCLUDE (CarrierTrackingNumber, OrderQty, UnitPrice, UnitPriceDiscount)3 WITH4 (5     DROP_EXISTING = ON6 )7 GO

我們已經做出了另1個改變,因此我們可以重新運行了查詢來驗證下。但是這次我們不加查詢提示,因為現在查詢優化器會自動選擇非聚集索引。結果如何捏?當你看執行計劃時,索引現在已被選擇。

SQL Server現在在非聚集索引上進行了查找操作,但在執行計劃里我們還有排序(Sort)運算符。因為基數計算30%的硬編碼,排序(Sort)還是要蔓延到TempDb。偶滴神!我們的邏輯讀已經降到了757,但運行時間還是近800毫秒。你現在應該怎么做?

現在我們可以嘗試在非聚集索引的導航結構直接包含CarrierTrackingNumber列。這是SQL Server進行排序運算符的列。當我們在非聚集索引直接加了這列(作為主鍵),我們就物理排序了那列,因此排序(Sort)運算符應該會消失。作為積極的副作用,也不會蔓延到TempDb。在執行計劃里,現在也沒有運算符關心錯誤的基數計算。因此我們嘗試那個假設,再次重建非聚集索引:

1 CREATE NONCLUSTERED INDEX idx_Test ON Sales.SalesOrderDetail(CarrierTrackingNumber, ProductID)2 INCLUDE (OrderQty, UnitPrice, UnitPriceDiscount)3 WITH4 (5     DROP_EXISTING = ON6 )7 GO

從索引定義可以看到,現在我們已經對CarrierTrackingNumber和ProductID列的數據物理預排序。當你再次重新執行查詢,在你查看執行計劃時,你會看到排序(Sort)運算符已經消失,SQL Server掃描了非聚集索引的整個葉子層(使用剩余謂語(residual predicate)作為搜索謂語)。

這個執行計劃并不壞!我們只需要763個邏輯讀,現在的運行時間已經降至600毫秒。和剛才的相比已經有25%的改善!但是:查詢優化器建議我們一個更好的非聚集索引,通過缺少索引建議(Missing Index Recommendations)!暫且相信下,我們創建建議的非聚集索引:

1 CREATE NONCLUSTERED INDEX [SQL Server doesn't care about names, why I should care about names?]2 ON [Sales].[SalesOrderDetail] ([ProductID])3 INCLUDE ([SalesOrderID],[SalesOrderDetailID],[CarrierTrackingNumber],[OrderQty],[LineTotal])4 GO

當你現在重新執行最初的查詢,你會發現令人驚訝的事情:查詢優化器使用“我們”剛才創建的非聚集索引,缺少索引建議已經消失!

你剛剛創建了SQL Server從不使用的索引——除了INSERT,UPDATE和DELETE語句,SQL Server都要去維護你的非聚集索引。對于你的數據庫,你剛創建了“單純”浪費空間的索引。當另一方面,你已經通過消除丟失索引建議,滿足了查詢優化器。但這不是目的:目的是創建會被再次使用的索引。

結論:永不相信查詢優化器!

小結

今天的文章有點爭議性,但我想你向你展示下,但你在創建索引時,查詢優化器如何幫助你,還有查詢優化器如何愚弄你。因此做出小的調整,就立即運行你的查詢,驗證改變非常重要。還有當你使用來查詢優化器的缺少索引建議時,請考慮下這個建議是個好的么。額,我已經說過——我會直接咔嚓掉。呵呵~~~

感謝關注!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频在线播放| 全亚洲最色的网站在线观看| 成人av资源在线播放| 国产欧美精品日韩| 最近免费中文字幕视频2019| 精品国产一区二区三区久久狼黑人| 日韩经典中文字幕在线观看| 在线日韩日本国产亚洲| 国产福利精品av综合导导航| 一本色道久久综合狠狠躁篇怎么玩| 国产一区二区三区在线观看网站| 亚洲综合在线播放| zzijzzij亚洲日本成熟少妇| 亚洲女性裸体视频| 青青在线视频一区二区三区| 欧美激情欧美激情在线五月| 欧美成人精品影院| 久久99国产综合精品女同| 国产成人鲁鲁免费视频a| 国产成人一区二区| 91成人福利在线| 久久久综合免费视频| 2020国产精品视频| 久久精品国产欧美激情| 日韩激情第一页| www.久久草.com| 亚洲第一黄色网| 少妇高潮久久久久久潘金莲| 91香蕉亚洲精品| 日韩在线视频中文字幕| 国产精品成人aaaaa网站| 久久精品欧美视频| 96精品视频在线| 中文字幕在线精品| 精品国产一区久久久| 成人午夜高潮视频| 国产精品白嫩美女在线观看| 另类色图亚洲色图| 国产精品久久久久久中文字| 国产视频在线观看一区二区| 亚洲欧美综合图区| 国产精品成久久久久三级| 免费av在线一区| 精品中文字幕在线观看| 欧美在线影院在线视频| 国产又爽又黄的激情精品视频| 最近2019中文字幕mv免费看| 亚洲综合日韩在线| 88xx成人精品| 日本一区二三区好的精华液| 亚洲一区999| 夜夜嗨av一区二区三区四区| 国产女精品视频网站免费| 91嫩草在线视频| 亚洲欧美变态国产另类| 日韩美女av在线免费观看| 日韩大片在线观看视频| 韩国国内大量揄拍精品视频| 欧美主播福利视频| 国产精品黄视频| 国产丝袜一区二区三区| 国产盗摄xxxx视频xxx69| 欧美一区二区.| 免费不卡在线观看av| 美日韩精品视频免费看| 亚洲va欧美va国产综合久久| 欧美激情喷水视频| 日韩精品极品在线观看播放免费视频| 97涩涩爰在线观看亚洲| 欧美日韩亚洲高清| 欧美天天综合色影久久精品| 亚洲第一av网站| 欧美国产精品va在线观看| 在线成人免费网站| 日本免费在线精品| 91在线色戒在线| 亚洲日韩欧美视频| 欧美午夜激情小视频| 欧美精品在线观看| 亚洲免费影视第一页| 亚洲片在线观看| 国产精品久久久久久久久久久久久久| 亚洲人成五月天| 亚洲xxxxx电影| 国产精品嫩草影院久久久| 成人免费激情视频| 成人黄色免费看| 精品久久久久久中文字幕一区奶水| 九九久久综合网站| 亚洲一区二区中文| 亚洲欧洲日本专区| 欧美一级淫片播放口| 国产成人精品电影久久久| 亚洲网站视频福利| 2018中文字幕一区二区三区| 尤物精品国产第一福利三区| 欧美视频专区一二在线观看| 成人h猎奇视频网站| 亚洲欧美日韩中文视频| 国产精品高潮呻吟久久av黑人| 国产成人综合精品| 日本高清不卡的在线| 欧美色道久久88综合亚洲精品| 亚洲精品乱码久久久久久金桔影视| 精品福利樱桃av导航| 久久久午夜视频| 一区二区三区精品99久久| 国产精品h片在线播放| 欧美壮男野外gaytube| 狠狠久久亚洲欧美专区| 国产精品久久二区| 成人免费高清完整版在线观看| 欧美视频国产精品| 成人免费观看a| 亚洲a∨日韩av高清在线观看| 国产九九精品视频| 国产精品美女主播| 国产成人小视频在线观看| 亚州欧美日韩中文视频| 精品久久中文字幕| 精品国产老师黑色丝袜高跟鞋| 九九热最新视频//这里只有精品| 亚洲三级 欧美三级| 韩国v欧美v日本v亚洲| 两个人的视频www国产精品| 日韩久久午夜影院| 国产成人激情视频| 亚洲精品视频中文字幕| 在线观看久久久久久| 国产精品美女在线| 亚洲综合在线小说| 久久夜色撩人精品| 美女扒开尿口让男人操亚洲视频网站| 日本道色综合久久影院| 国产一区二区三区久久精品| 久久久www成人免费精品| 2019中文字幕在线免费观看| www.欧美免费| 亚洲自拍偷拍色图| 欧美理论电影在线播放| 久久久免费观看视频| 亚洲999一在线观看www| 日韩成人在线视频| 欧美精品videosex牲欧美| 亚洲www在线| 一区二区成人av| 久久精品一本久久99精品| 中文日韩电影网站| 日韩国产欧美精品在线| 欧美国产乱视频| 富二代精品短视频| 91久久久久久久久久久| 亚洲男人天堂久| 97成人精品视频在线观看| 操91在线视频| 欧美区在线播放| 久久亚洲精品小早川怜子66| 日韩欧美中文字幕在线观看| 成人欧美一区二区三区黑人| 国产精品久久久久久一区二区| 亚洲国产毛片完整版| 国产精品偷伦免费视频观看的| 久久影院资源站| 久久免费高清视频|