一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

SQL Server 索引優(yōu)化

 瓜瓜2uuq7332fe 2019-01-04

我們知道,合理的索引能大幅提升性能,但冗余的索引也會(huì)降低數(shù)據(jù)庫(kù)性能。隨著我們業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫(kù)的中的表、表結(jié)構(gòu)、查詢的內(nèi)容都有可能發(fā)生變化。這樣,有的索引就可能不再使用了,需要?jiǎng)h除(因?yàn)榫S護(hù)索引即浪費(fèi)存儲(chǔ),又耗費(fèi)性能);而有的表則需要修改或者增加索引。本文主要給出快速確定不再使用的索引的查找方式之一,動(dòng)態(tài)視圖(DMV)查詢。

無(wú)用索引

首先我們來(lái)看一下如何查詢無(wú)用的索引。sys.dm_db_index_usage_stats 記錄自上次重啟或數(shù)據(jù)庫(kù)離線或重置統(tǒng)計(jì)信息后使用到的索引,sys.indexes 記錄數(shù)據(jù)中所有表的索引,排除掉最近使用的索引,即為最近沒(méi)有使用的索引,具體腳本如下:

  1. --查詢數(shù)據(jù)庫(kù)中沒(méi)有使用過(guò)到索引
  2. USE WideWorldImporters;
  3. GO
  4. DECLARE @dbid INT=DB_ID('WideWorldImporters');
  5. WITH cte AS(
  6. SELECT
  7. [object_id],index_id
  8. FROM sys.indexes
  9. EXCEPT
  10. SELECT
  11. [object_id],index_id
  12. FROM sys.dm_db_index_usage_stats
  13. WHERE database_id=@dbid)
  14. SELECT
  15. o.name tableName,i.name indexName
  16. FROM sys.indexes i
  17. INNER JOIN cte ON cte.index_id=i.index_id AND cte.[object_id]=i.[object_id]
  18. INNER JOIN sys.objects o ON i.[object_id]=o.[object_id]
  19. WHERE o.[type] IN ('U','V') AND i.[type]>0;

因?yàn)槲覀冎豢疾煊脩魟?chuàng)建的表或者索引視圖,最后我們只篩選出sys.objects 中type為“U”(用戶創(chuàng)建的表)和“V”(用戶創(chuàng)建的視圖索引)。sys.indexes 中type=0是堆,所以也排除。下面給出產(chǎn)生刪除索引的腳本:

 

  1. --刪除沒(méi)有使用過(guò)索引腳本產(chǎn)生
  2. USE WideWorldImporters;
  3. GO
  4. DECLARE @dbid INT=DB_ID('WideWorldImporters');
  5. WITH cte AS(
  6. SELECT
  7. [object_id],index_id
  8. FROM sys.indexes
  9. EXCEPT
  10. SELECT
  11. [object_id],index_id
  12. FROM sys.dm_db_index_usage_stats
  13. WHERE database_id=@dbid)
  14. SELECT
  15. 'DROP INDEX '+i.name+' ON '+ o.name
  16. FROM sys.indexes i
  17. INNER JOIN cte ON cte.index_id=i.index_id AND cte.[object_id]=i.[object_id]
  18. INNER JOIN sys.objects o ON i.[object_id]=o.[object_id]
  19. WHERE o.[type] IN ('U','V') AND i.[type]>0;

上面的腳本每條對(duì)應(yīng)一個(gè)表的一個(gè)索引的刪除語(yǔ)句,當(dāng)然也可以使用如下腳本產(chǎn)生一條語(yǔ)句。

  1. DECLARE @dbid INT=DB_ID('WideWorldImporters');
  2. declare @sql varchar(max);
  3. WITH cte AS(
  4. SELECT
  5. [object_id],index_id
  6. FROM sys.indexes
  7. EXCEPT
  8. SELECT
  9. [object_id],index_id
  10. FROM sys.dm_db_index_usage_stats
  11. WHERE database_id=@dbid)
  12. SELECT @sql=(
  13. SELECT
  14. 'drop index '+i.name+' on '+ o.name
  15. FROM sys.indexes i
  16. INNER JOIN cte ON cte.index_id=i.index_id AND cte.[object_id]=i.[object_id]
  17. INNER JOIN sys.objects o ON i.[object_id]=o.[object_id]
  18. WHERE o.[type] IN ('U','V') AND i.[type]>0
  19. FOR XML PATH(''),type).value('.','NVARCHAR(MAX)');
  20. --exec sp_executesql @sql

細(xì)心的讀者會(huì)發(fā)現(xiàn),上面最后一條語(yǔ)句(exec sp_executesql @sql)是注釋掉的,直接這樣執(zhí)行是可以最快速的刪除所有無(wú)用索引。但是,正如我們上面所說(shuō)的,sys.dm_db_index_usage_stats 記錄自上次重啟或數(shù)據(jù)庫(kù)離線或重置統(tǒng)計(jì)信息后使用到的索引,所以其記錄的用到的索引可能是不全的(如果我們最近剛重啟過(guò)數(shù)據(jù)庫(kù)服務(wù)、數(shù)據(jù)庫(kù)所在的服務(wù)器或者重置了動(dòng)態(tài)視圖),這樣可能導(dǎo)致部分有用的索引也被刪除掉,切記、切記、切記,生成的腳本不能直接執(zhí)行。保險(xiǎn)的做法是,至少,在數(shù)據(jù)庫(kù)服務(wù)運(yùn)行一個(gè)月做這樣的事情,如果有經(jīng)常重啟維護(hù)的數(shù)據(jù)庫(kù)服務(wù),可以在數(shù)據(jù)庫(kù)重啟維護(hù)之前收集記錄已經(jīng)使用的索引。經(jīng)過(guò)幾個(gè)月或一年的記錄,最終確定不需要的索引,再進(jìn)行刪除。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    视频一区二区三区自拍偷| 国产精品日韩精品最新| 五月婷婷六月丁香在线观看| 免费性欧美重口味黄色| 国产成人精品一区在线观看| 亚洲午夜av一区二区| 精品国产丝袜一区二区| 麻豆一区二区三区精品视频| 亚洲精品一区二区三区日韩| 午夜福利视频日本一区| 亚洲精品偷拍视频免费观看| 好吊日视频这里都是精品| 国产国产精品精品在线| 日韩欧美一区二区不卡视频| 亚洲熟妇熟女久久精品 | 国产又粗又爽又猛又黄的| 日韩精品第一区二区三区| 激情中文字幕在线观看| 国产综合欧美日韩在线精品| 女人精品内射国产99| 日韩偷拍精品一区二区三区| 东京热男人的天堂社区| 亚洲伊人久久精品国产| 色婷婷激情五月天丁香| 国产一区二区三区午夜精品| 日本不卡一本二本三区| 久久这里只有精品中文字幕| 国产色第一区不卡高清| 亚洲欧美日韩网友自拍| 香港国产三级久久精品三级| 欧美性猛交内射老熟妇| av免费视屏在线观看| 日本不卡一区视频欧美| 欧美成人精品一区二区久久| 国产成人免费高潮激情电| 日韩人妻av中文字幕| 少妇人妻中出中文字幕| 狠狠做五月深爱婷婷综合| 情一色一区二区三区四| 日本高清中文精品在线不卡| 久热人妻中文字幕一区二区|