MSSQL索引优化之无用索引和索引缺失
Tags: MSSQLSQL Server索引优化
我们知道,合理的索引能大幅提升性能,但冗余的索引也会降低数据库性能。随着我们业务的发展,数据库的中的表、表结构、查询的内容都有可能发生变化。这样,有的索引就可能不再使用了,需要删除(因为维护索引即浪费存储,又耗费性能);而有的表则需要修改或者增加索引。本文主要给出快速确定不再使用的索引的查找方式之一,动态视图(DMV)查询。
无用索引
首先我们来看一下如何查询无用的索引。sys.dm_db_index_usage_stats 记录自上次重启或数据库离线或重置统计信息后使用到的索引,sys.indexes 记录数据中所有表的索引,排除掉最近使用的索引,即为最近没有使用的索引,具体脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | --查询数据库中没有使用过的索引 USE WideWorldImporters; GO DECLARE @dbid INT=DB_ID('WideWorldImporters'); WITH cte AS( SELECT [object_id],index_id FROM sys.indexes EXCEPT SELECT [object_id],index_id FROM sys.dm_db_index_usage_stats WHERE database_id=@dbid) SELECT o.name tableName,i.name indexName FROM sys.indexes i INNER JOIN cte ON cte.index_id=i.index_id AND cte.[object_id]=i.[object_id] INNER JOIN sys.objects o ON i.[object_id]=o.[object_id] WHERE o.[type] IN ('U','V') AND i.[type]>1 AND is_primary_key=0 ; |