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

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

SQL Server調優系列玩轉篇三(利用索引提示(Hint)引導語句最大優化運行)

2024-08-31 00:54:52
字體:
來源:轉載
供稿:網友
SQL Server調優系列玩轉篇三(利用索引提示(Hint)引導語句最大優化運行)

前言

本篇繼續玩轉模塊的內容,關于索引在SQL Server的位置無須多言,本篇將分析如何利用Hint引導語句充分利用索引進行運行,同樣,還是希望扎實掌握前面一系列的內容,才進入本模塊的內容分析。

閑言少敘,進入本篇的內容。

技術準備

數據庫版本為SQL Server2012,利用微軟的以前的案例庫(Northwind)進行分析,部分內容也會應用微軟的另一個案例庫AdventureWorks。

相信了解SQL Server的朋友,對這兩個庫都不會太陌生。

一、并行Hint提示(MAXDOP N Hint)

在當前多核超線程的今天,并行運算已經不算什么稀罕了,所以在SQL Server中也有它自己的并行運算符,來充分的利用現有硬件資源,最大限度的提升運行效率。

在本系列中有兩篇文章專門介紹關于SQL Server的并行運算,可以點擊查看:SQL Server并行運算總結、SQL Server并行運算總結篇二

所以,在Hint中也給出了關于并行運算的提示:MAXDOP N Hint,這個Hint還是經常用的,尤其索引操作的時候,為了縮短操作時間,我們常常會最大限度的利用并行運算。

另外,此Hint會優先于數據庫級別的配置選項。也就說盡管在數據庫中設置了MAXDOP 1(強制順序運行),如果使用了此Hint也會忽略數據庫設置的。

當然,并行運算雖然大部分情況能提升運行效率,但是也非絕對,我們知道多線程的操作是需要維護線程之間的數據交換和執行順序等,所有有時候多線程的執行并不一定會單線程效率高。

來看個例子:

SELECT [KEY],[DATA]FROM TestMaxDopTableWHERE DATA<1000OPTION(MAXDOP 1)SELECT [KEY],[DATA]FROM TestMaxDopTableWHERE DATA<1000OPTION(MAXDOP 4)

上面為串行運算,下面為4線程的并行運算。

當然,此處幾線程運算可以自己設定,最大值推薦為當前系統配置的邏輯核數,當然設置大了也可以只不過沒用罷了。

、索引Hint提示(INDEX Hint)

所謂的索引Hint提示,就是強制查詢優化器為一個查詢語句執行掃描或者使用一個指定的索引。

此方式,是我們在調優中經常用到的一種方式,很多時候我們創建的索引是失效的,當然,大部分情況下失效的原因是創建索引不妥當導致的,但是有一些情況下,需要我們來指導下T-SQL的運行方式,這時候就是索引Hint的使用場景了。

當然,這里能利用索引提示的前提就是當前表存在索引了,如果是堆表的情況,根本就談不上了索引提示了,只能通過表掃描獲取數據了。

來看看這個提示的用法:WITH(INDEX(N))

這里的N就是索引的在該表中索引順序排序號了,來看一張表中的索引序列號:

SELECT * FROM SYS.indexesWHERE OBJECT_NAME(object_id)='Orders'

可以看到,該表中存在十個索引,依次排序之后,就是從1至10,第一個就是聚集索引(主鍵)了,然后是非聚集索引。

所以,我們上面的N的值就是這個數字了,指定幾就是要求用哪個索引了。

來看個腳本:

SELECT OrderID,CustomerIDFROM Orders WITH(INDEX(1))WHERE ShipPostalCode=N'99362'SELECT OrderID,CustomerIDFROM Orders WITH(INDEX(9))WHERE ShipPostalCode=N'99362'

看到了,上面的例子中我們選了兩個索引:一個編號1的聚集索引PK_Orders,一個編號為9的非聚集索引了ShipPostalCode。當然,有興趣也可以玩玩其它幾個索引。

我們順便來分析下這個語句的索引用法:

首先從查詢條件來看,我們是根據ShipPostalCode進行查詢,所以最好在該列中被索引所覆蓋,這樣在數據量大的情況下,查詢優化器就可以采用索引查找(Index Seek)了,所以,這里我們選擇了第9個非聚集索引,恰巧覆蓋該列值,從上面的查詢計劃也可以看出,采用該索引Hint提示后查詢開銷從69%提升至3%...但是由于這個非聚集索引沒有包含CustomerID列,所以不得不又引入書簽查找(key Lookup)來獲取該列值,并且這個書簽查找消耗還比較大:60%,所以最佳的方式就是將該索引Include進CustomerID列。

當然,此方式用起來可能很不爽,因為我們在使用的時候需要查找當前表中的各個索引的排序號。

所以,我們最推薦也是最常用的方式是這樣:

WITH(INDEX('IndexName'))

就是我們直接指定索引名稱既可以,來看個例子:

SELECT OrderID,CustomerIDFROM Orders WITH(INDEX(CustomersOrders))WHERE ShipPostalCode=N'99362'

看起來,簡單的多了,因為索引的名字我們直接能看到,來看看我們將這個查詢語句指定到這個非聚集索引CustomersOrders上的執行計劃。

來看看這個查詢計劃:丫的!.....查詢開銷直接飆升到100%......原因很簡單:這個非聚集索引和這個查詢一毛錢關系....但是我們卻強制的指定該語句利用索引執行....

首先非聚集索引包含的列為:[OrderID],[CustomerID]

我們要獲取的值為按照ShipPostalCode進行篩選,所以要獲取結果就必須按照這個非聚集索引進行一次掃描(Index Scan),這個還可以,畢竟非聚集索引都是有序進行的,但是為了進行過濾,就必須引入書簽查找(Key Lookup)進行過濾,我們知道書簽查找為隨機IO,消耗巨大,所以這次過濾就好比在整張表中隨機的去查找數據一樣,其實效率還不如來一次表掃描(Table Scan)的好,所以此開銷飆升到95%!

上面的例子,也是很多新手容易犯的錯誤。

我記得在玩轉模塊的第一篇中,我們提到過一個利用OPTIMIZE FORHint提示解決一個引入參數而導致的執行計劃評估不準的問題。

文章可以點擊此處看到:SQL Server調優系列玩轉篇(如何利用查詢提示(Hint)引導語句運行)

我們來回顧下:

--普通的查詢語句SELECT OrderID,OrderDateFROM OrdersWHERE ShipPostalCode=N'51100'--參數化后的查詢語句DECLARE  @ShipPostalCode NVARCHAR(50)SET @ShipPostalCode=N'51100'SELECT OrderID,OrderDateFROM OrdersWHERE ShipPostalCode=@ShipPostalCode

完全相同邏輯的查詢語句,只是下面那個我們通過參數進行了傳值操作。

我們只是加了一個參數,SQL Server將相同的查詢語句,有以前的索引查找變成了索引掃描了!

消耗一下子從46%提升到54%.....這也是我們寫的語句經常遇到的問題,因為很多情況下,我們都是通過傳參來實現該語句的重用性。

但是,為什么加了參數使得查詢性能變差,顯然不是一個好的方式,在第一篇的玩轉篇中,我們的解決方式是通過OPTIMIZE FORHint提示解決。

這里,我們再來看一個解決方式,也可以通過索引Hint來強制該語句指定按照給定的索引進行查找。

方法如下:

--參數化后的查詢語句DECLARE  @ShipPostalCode NVARCHAR(50)SET @ShipPostalCode=N'51100'SELECT OrderID,OrderDateFROM Orders WITH(INDEX(ShipPostalCode))WHERE ShipPostalCode=@ShipPostalCode

是不是一個很帥的方式。

希望你能理解這些個方式的好處,算作拋磚引玉了。

結語

此篇文章先到此吧,到此玩轉篇已經三篇了,關于SQL Server調優工具Hint的使用還有很多內容,后續依次介紹,有興趣的童鞋可以提前關注。

有問題可以留言或者私信,隨時恭候有興趣的童鞋加入SQL SERVER的深入研究。共同學習,一起進步。

文章最后給出前面幾篇的連接,以下內容基本涵蓋我們日常中所寫的查詢運算的分解以及調優內容項,皆為原創........

第一個基礎模塊注重基礎內容的掌握,共分7篇文章完成,內容涵蓋一系列基礎運算算法,詳細分析了如何查看執行計劃、掌握執行計劃優化點,并一一列舉了日常我們平常所寫的T-SQL語句所會應用的運算符:

SQL Server調優系列基礎篇

SQL Server調優系列基礎篇(常用運算符總結)

SQL Server調優系列基礎篇(聯合運算符總結)

SQL Server調優系列基礎篇(并行運算總結)

SQL Server調優系列基礎篇(并行運算總結篇二)

SQL Server調優系列基礎篇(索引運算總結)

SQL Server調優系列基礎篇(子查詢運算總結)

第二個進階模塊注重SQL Server執行T-SQL語句的時候一些內幕解析,共分為5篇文章完成,其中包括:查詢優化器的運行方式、運行時幾個優化指標值檢測,統計信息、利用索引等一系列內容。通過這塊內容讓我們了解SQL Server為我們所寫的T-SQL語句如何進行優化及運行的。

SQL Server調優系列進階篇(查詢優化器的運行方式)

SQL Server調優系列進階篇(查詢語句運行幾個指標值監測)

SQL Server調優系列進階篇(深入剖析統計信息)

SQL Server調優系列進階篇(如何索引調優)

SQL Server調優系列進階篇(如何維護數據庫索引)

第三個玩轉模塊重點跟進特定的問題進行特定的提示(Hints),基于前兩個模塊進行的分析。

SQL Server調優系列玩轉篇(如何利用查詢提示(Hint)引導語句運行)

SQL Server調優系列玩轉篇二(如何利用匯聚聯合提示(Hint)引導語句運行)

如果您看了本篇博客,覺得對您有所收獲,請不要吝嗇您的“推薦”。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丝袜一区二区三区| 欧洲成人在线观看| 欧美日韩国产专区| 成人福利在线观看| 超在线视频97| 国产成人久久精品| 国产婷婷97碰碰久久人人蜜臀| 欧美激情videoshd| 国产精品扒开腿做爽爽爽男男| 亚洲一区亚洲二区亚洲三区| 精品国产电影一区| 日韩中文在线视频| 国产精品影院在线观看| 91av在线网站| 爱福利视频一区| 成人网中文字幕| 国模gogo一区二区大胆私拍| 亚洲a中文字幕| 亚洲欧美一区二区三区久久| 欧洲午夜精品久久久| 欧美性videos高清精品| 伊人久久免费视频| 亚洲欧美日本伦理| 亚洲激情久久久| 欧美日韩国产精品专区| 国产激情久久久久| 欧美高清在线观看| 欧美裸体男粗大视频在线观看| 日韩免费观看av| 一区二区欧美日韩视频| 国产精品视频精品视频| 91麻豆国产语对白在线观看| 国产精品三级在线| 国产综合福利在线| 国产精品吊钟奶在线| 亚洲精品国产拍免费91在线| 美女黄色丝袜一区| 亚洲天堂开心观看| 国产精品爽黄69| 亚洲人成电影网站色xx| 国产69精品久久久久9999| 少妇av一区二区三区| 2019中文字幕在线免费观看| www.亚洲男人天堂| 久久久91精品国产一区不卡| 欧美裸体xxxx| 久久精品一本久久99精品| 日韩女在线观看| 一区二区中文字幕| 国产亚洲欧美日韩一区二区| 日韩福利伦理影院免费| 国产精品久久久久久av福利软件| 成人网在线视频| 亚洲精品动漫100p| 欧美成人精品h版在线观看| 91成人国产在线观看| 亚洲欧洲一区二区三区在线观看| 欧美视频13p| 久久久久亚洲精品国产| 中文字幕日韩欧美| 欧美一级大胆视频| 奇米4444一区二区三区| 欧美精品电影在线| 在线视频免费一区二区| 丝袜美腿亚洲一区二区| 亚洲天堂网在线观看| 国产精品美女久久久久av超清| 日韩美女在线看| 亚洲欧美在线免费观看| 日韩av成人在线观看| 日韩在线视频一区| 亚洲国产欧美一区二区三区同亚洲| 日韩在线观看免费全集电视剧网站| 欧美精品在线免费观看| 爽爽爽爽爽爽爽成人免费观看| 日韩中文字幕免费视频| 亚洲精品aⅴ中文字幕乱码| 日本精品在线视频| 国产成人精品在线视频| 亚洲电影免费观看高清完整版在线观看| 中文字幕久久亚洲| 国产精品444| 国产精品扒开腿做爽爽爽视频| 国产亚洲免费的视频看| 精品女同一区二区三区在线播放| 久久久之久亚州精品露出| 日韩av在线影院| 亚洲国产三级网| 91日韩在线视频| 欧美在线观看日本一区| 欧美亚洲国产另类| 色播久久人人爽人人爽人人片视av| 深夜精品寂寞黄网站在线观看| 亚洲一区二区三区四区在线播放| 伊人久久久久久久久久久久久| 欧美激情亚洲综合一区| 日韩av成人在线| 欧美日韩国产一区二区| 国产精品自产拍在线观看中文| 国产精品美乳在线观看| 国产一区二区久久精品| 日韩av大片免费看| 亚洲成人动漫在线播放| xxxxxxxxx欧美| 成人国内精品久久久久一区| 国产一区二区三区视频免费| 大伊人狠狠躁夜夜躁av一区| 最近2019中文免费高清视频观看www99| 久久久久久亚洲精品| 欧美日韩一二三四五区| 综合国产在线视频| 欧美xxxx做受欧美.88| 欧美激情网友自拍| 日韩福利视频在线观看| 国内精品视频在线| 亚洲自拍偷拍网址| 国产午夜精品视频免费不卡69堂| 在线亚洲午夜片av大片| 久久精品99国产精品酒店日本| 亚洲a在线观看| 国产精品欧美在线| 韩国视频理论视频久久| 日本不卡免费高清视频| 欧美福利视频在线| 日本a级片电影一区二区| 97在线观看视频| 欧美精品久久一区二区| 国产脚交av在线一区二区| 国产亚洲人成网站在线观看| 久久精品视频导航| 欧美激情一二区| 欧美视频免费在线观看| 日韩二区三区在线| 91亚洲精品在线观看| 一个人看的www欧美| 亚洲欧美在线一区| 国产91|九色| 精品高清一区二区三区| 国产精品久久久久久久app| 日本免费久久高清视频| 日韩精品视频免费在线观看| 久久人91精品久久久久久不卡| 欧美日韩成人在线视频| 欧美一级片在线播放| 国产精品91在线| 性色av一区二区三区在线观看| 亚洲国产日韩精品在线| 黑人巨大精品欧美一区免费视频| 日韩在线免费视频观看| 7m第一福利500精品视频| 精品视频一区在线视频| 亚洲午夜未删减在线观看| 日韩在线视频网| 欧美精品九九久久| 欧美精品亚州精品| 狠狠久久亚洲欧美专区| 日韩av在线导航| 久久久人成影片一区二区三区观看| 亚洲国产精品人久久电影| 日本精品一区二区三区在线播放视频| 亚洲免费人成在线视频观看| 97久久精品人搡人人玩| 亚洲人成网站免费播放| 91免费欧美精品|