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

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

程序員眼中的 SQL Server-執行計劃教會我如何創建索引?

2024-08-31 00:55:26
字體:
來源:轉載
供稿:網友
程序員眼中的 SQL Server-執行計劃教會我如何創建索引?先說點廢話

以前有 DBA 在身邊的時候,從來不曾考慮過數據庫性能的問題,但是,當一個應用程序從頭到腳都由自己完成,而且數據庫面對的是接近百萬的數據,看著一個頁面加載速度像烏龜一樣,自己心里真是有種挫敗感。代碼的優化問題,這是屬于程序員的職責范圍之內,對于我來說,這一方面比較好探查些,因為都是自己熟悉的,用 EF 或 SQL Server PRofiler 跟蹤一下程序代碼產生的 SQL,如果有問題,直接優化程序代碼就可以了,如果 SQL 沒問題,那就得優化數據庫了,對于我來說,這是一個無人區。

前兩天,自己瞎搞了一個測試:程序員眼中的 SQL Server-非聚集索引能給我們帶來什么?,因為對索引不是很熟悉,所以測試得到結果沒有任何價值,甚至有些誤導人,這邊說聲抱歉,在哪跌倒在哪爬起來。

應用場景

還是用商品表(Product)作為示例,表結構如下:

存在這樣一種業務場景:獲取某個供應商(ProviderID),狀態為已售(State 為 1)的商品列表,排序方式為生產日期(ProduceTime)降序,有可能我們應用程序在顯示數據的時候用到分頁,這邊我們查詢前 100 行。翻譯為 SQL 代碼:

SELECT TOP 100 [ID],[Name],[Remarks],[ProviderID],[ProduceTime],[State]FROM [TestDB].[dbo].[Product]WHERE [ProviderID]=1 AND [State]=1ORDER BY [ProduceTime] DESC

上面這個業務場景,在我們一般的應用程序中基本上都會遇到,有時候數據量不是很大的時候,我們一般不會做任何數據庫優化,但是你看了下面的實踐,你是否應該考慮下,為你現在的數據庫加個索引呢?

SQL Server 執行計劃

SQL Server 執行計劃,是我們分析 SQL 執行情況的一大利器,通過它,我們也可以很方面的查看索引的執行,在實踐之前,需要了解一些必備技能,以下知識點摘自-看懂 SqlServer 查詢計劃。

SQL Server 有二種索引:聚集索引和非聚集索引。二者的差別在于:【聚集索引】直接決定了記錄的存放位置, 或者說:根據聚集索引可以直接獲取到記錄。【非聚集索引】保存了二個信息:1.相應索引字段的值,2.記錄對應聚集索引的位置(如果表沒有聚集索引則保存記錄指針)。 因此,如果能通過【聚集索引】來查找記錄,顯然也是最快的。

SQL Server 會有以下方法來查找您需要的數據記錄:

  1. 【Table Scan】:遍歷整個表,查找所有匹配的記錄行。這個操作將會一行一行的檢查,當然,效率也是最差的。
  2. 【Index Scan】:根據索引,從表中過濾出來一部分記錄,再查找所有匹配的記錄行,顯然比第一種方式的查找范圍要小,因此比【Table Scan】要快。
  3. 【Index Seek】:根據索引,定位(獲?。┯涗浀拇娣盼恢?,然后取得記錄,因此,比起前二種方式會更快。
  4. 【Clustered Index Scan】:和【Table Scan】一樣。注意:不要以為這里有個Index,就認為不一樣了。 其實它的意思是說:按聚集索引來逐行掃描每一行記錄,因為記錄就是按聚集索引來順序存放的。 而【Table Scan】只是說:要掃描的表沒有聚集索引而已,因此這二個操作本質上也是一樣的。
  5. 【Clustered Index Seek】:直接根據聚集索引獲取記錄,最快!

所以,當發現某個查詢比較慢時,可以首先檢查哪些操作的成本比較高,再看看那些操作在查找記錄時, 是不是【Table Scan】或者【Clustered Index Scan】,如果確實和這二種操作類型有關,則要考慮增加索引來解決了。 不過,增加索引后,也會影響數據表的修改動作,因為修改數據表時,要更新相應字段的索引。所以索引過多,也會影響性能。 還有一種情況是不適合增加索引的:某個字段用0或1表示的狀態。例如可能有絕大多數是1,那么此時加索引根本就沒有意義。 這時只能考慮為0或者1這二種情況分開來保存了,分表或者分區都是不錯的選擇。

應用分析

我們先不建任何索引(除了主鍵 ID 的聚集索引),來看一下上面 SQL 代碼,在 SQL Server 執行計劃中的執行情況:

可以看到,查詢開銷基本上被 SORT 霸占了,看到這種情況,按照正常的思維,我們首先考慮的是為 ProduceTime 創建一個非聚集索引,然后按照 DESC 排序,但有時候我們要沉下心思考一下,是不是用 ID 排序會更好呢?因為在 Product 表中,ID 為自增字段,ProduceTime 在添加的時候獲取的是當前時間,在 SQL 排序中,其實 ID 和 ProduceTime 的排序效果是一樣的,但是執行性能方面確實天壤之別,我們看一下執行計劃就知道了:

從上面的執行計劃中,我們可以很直觀的看出差別,所以在寫 SQL 的時候,一定要慎重啊,這邊為了方便展示,我們還是以 ProduceTime 字段進行排序,按照 ID 排序,雖然沒有了 SORT 性能開銷,但是發現查詢記錄為“Clustered Index Scan”,這是全表查詢的意思,我們理想的應該是“Index Seek”或者“Clustered Index Seek”,因為這種是按照索引查詢,速度最快。按照我們程序員的理解,應該創建一個非聚集索引,比如下面 IX_Product_Provider_State 索引:

創建好之后,我們再來執行一下 SQL 代碼:

“Key Lookup(Clustered)”記錄,其實還是全表進行查找,默認通過聚集索引(PK_Product),我們可能會有疑問,索引就是按照查詢及排序方式創建的啊,為什么還是這種情況?這時候我們看一下 SELECT 后面的字段就知道了,我們查詢顯示的是 Product 表中所有字段,但是 IX_Product_Provider_State 非聚集索引,只是針對的查詢條件字段,并沒有吧查詢顯示字段包含進來,在創建索引窗口中,“索引鍵 列” TAB 的旁邊有個“包含性 列”,我們把其他顯示字段加進來,看下執行效果:

“Index Seek”,這就是我們想要的效果,其實關于索引的創建有很多的現實問題,比如組合字段索引和單個字段索引有何不同?就像上面示例中的查詢用例,如果 ProduceTime 排序在其他查詢條件中也存在,是不是應該拉出來創建一個索引?還是像上面一樣,和查詢條件一起創建一個組合字段索引?還有一種情況就是,在一個應用程序查詢中,存在單個字段的查詢,也存在組合字段的查詢,那這時候我們是創建單個字段索引?還是創建組合字段索引呢?這幾個問題,你創建一下索引,然后用“ SQL 執行計劃”試試就知道了。

總結

針對上面的查詢用例,我個人覺得,最好的方案是:排序字段使用 ID,按照實際應用場景,提取出需要查詢的字段,避免 SELECT *,這樣會減少在添加“包含性 列”的字段,創建 IX_Product_Provider_State 非聚集索引,索引字段為:ProviderID 和 State,如果 State 的值不是多變的(比如值為 1 和 0),盡量不要創建 State 字段的非聚集索引。

做完這些,你會發現,你的應用程序像飛的一樣。

ps:我要飛得更高。。。

參考資料:

  • How to reduce clustered index scan cost by using SQL query
  • SQL Primary key sort order
  • Index Sort Order
  • 請問一下order by與索引的問題
  • 寫寫如果SELECT列表中,使用和不使用的索引使用情況

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美与欧洲交xxxx免费观看| 久久久久这里只有精品| 亚洲精品永久免费| 欧美中文字幕视频在线观看| 亚洲天天在线日亚洲洲精| 国产精品88a∨| 日本一区二区不卡| 国产成人精品免高潮费视频| 久久久久久久亚洲精品| 在线看片第一页欧美| 亚洲伊人第一页| 亚洲国产成人精品电影| 精品国内自产拍在线观看| 亚洲人成欧美中文字幕| 国产精品免费视频xxxx| 中文字幕欧美精品日韩中文字幕| 亚洲精品久久久久久下一站| 国产亚洲精品高潮| 成人女保姆的销魂服务| 久久深夜福利免费观看| 97精品国产97久久久久久春色| 在线日韩中文字幕| 国产精品欧美激情在线播放| 日韩av一区在线| 欧美日韩激情美女| 91久久久久久| 欧美第一淫aaasss性| 国产小视频国产精品| 中日韩美女免费视频网站在线观看| 国产精品露脸自拍| 日本欧美精品在线| 亚洲aa在线观看| 欧美亚洲在线播放| 国产婷婷成人久久av免费高清| 麻豆国产va免费精品高清在线| 国产精品稀缺呦系列在线| 精品毛片网大全| 亚洲精品欧美极品| 欧美一区二区.| 久久激情五月丁香伊人| 亚洲精品美女在线观看| 亚洲嫩模很污视频| 2019中文字幕在线免费观看| 日韩在线观看免费全集电视剧网站| 97免费视频在线| 一夜七次郎国产精品亚洲| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲电影在线看| 日韩欧美国产成人| 中文字幕免费国产精品| 亚洲偷熟乱区亚洲香蕉av| 久久精品福利视频| 日韩有码片在线观看| 日本aⅴ大伊香蕉精品视频| 国外成人在线直播| 日韩av片电影专区| 国产福利成人在线| 欧美亚洲国产成人精品| 欧美一级淫片播放口| 日韩美女视频免费在线观看| 欧美激情一区二区三区久久久| 精品国偷自产在线视频| 日本精品一区二区三区在线| 亚洲图片在线综合| 亚洲精品久久久久久久久久久久| 国产精品激情自拍| 成人美女av在线直播| 亚洲精品色婷婷福利天堂| 亚洲国产成人av在线| 国产噜噜噜噜噜久久久久久久久| 国产精品高精视频免费| 国外视频精品毛片| 亚洲黄色www| 国产精品观看在线亚洲人成网| 性欧美亚洲xxxx乳在线观看| 伊人亚洲福利一区二区三区| 欧美精品久久久久久久久| 91啪国产在线| 色悠久久久久综合先锋影音下载| 国自产精品手机在线观看视频| 国产精品无码专区在线观看| 97色在线视频观看| 自拍亚洲一区欧美另类| 亚洲国产成人在线播放| 国产欧美久久久久久| 久热精品视频在线观看一区| 91影院在线免费观看视频| 国产精品一久久香蕉国产线看观看| 国产日韩av高清| 国产日韩精品一区二区| 国产亚洲日本欧美韩国| 国产精品免费看久久久香蕉| 亚洲国产成人精品久久| 国产女精品视频网站免费| 色综合久久精品亚洲国产| 福利精品视频在线| 成人在线视频福利| 亚洲电影在线看| 日韩免费av在线| 国产精品大片wwwwww| 久久久久久国产精品| 中文字幕欧美日韩在线| 精品国产91久久久| 色婷婷**av毛片一区| 成人h猎奇视频网站| 日韩av片永久免费网站| www.xxxx欧美| 一本色道久久88综合亚洲精品ⅰ| 国a精品视频大全| 亚洲性av在线| 成人在线观看视频网站| 国产精品永久在线| 日韩av在线直播| 久久精品夜夜夜夜夜久久| 91精品美女在线| 欧美三级免费观看| 91人成网站www| 日韩高清a**址| 成人久久精品视频| 亚洲国产精品专区久久| 国产精品美乳一区二区免费| 亚洲精品按摩视频| 久久99久国产精品黄毛片入口| 国内精品模特av私拍在线观看| 正在播放欧美视频| 97免费视频在线播放| 国产精品91视频| 亚洲精品国产精品自产a区红杏吧| 成人激情黄色网| 亚洲激情视频在线观看| 精品国产乱码久久久久久虫虫漫画| 一本大道久久加勒比香蕉| 色综合久综合久久综合久鬼88| 精品中文字幕久久久久久| 久久精品成人一区二区三区| 欧美制服第一页| 国产精品大陆在线观看| 亚洲视频在线看| 欧美成人精品h版在线观看| 日韩欧美中文字幕在线播放| 国产精品久久久久久久app| 久久久欧美精品| 日韩一级裸体免费视频| 国产91精品高潮白浆喷水| 欧美一级淫片aaaaaaa视频| 亚洲欧美日韩爽爽影院| 日本精品va在线观看| 国产一区二区三区毛片| 97香蕉久久超级碰碰高清版| 亚洲国产成人精品久久久国产成人一区| 国产一区二区三区在线播放免费观看| 韩日欧美一区二区| 精品一区二区电影| 国产精品美乳在线观看| 欧美激情一二三| 黑人精品xxx一区| 成人美女免费网站视频| 亚洲va欧美va在线观看| 一区二区亚洲欧洲国产日韩| 91chinesevideo永久地址| 欧美大全免费观看电视剧大泉洋| 色综合久综合久久综合久鬼88| 5566成人精品视频免费| 欧美日韩精品在线|