SQL Server 性能优化之——重复索引

阅读导航

1. 概述

2. 什么是重复索引

3. 查找重复索引

4. 删除重复索引

5. 总结

 

1. 概述

很多人都知道索引在数据库上的是有利有弊的。像其他主流商业数据库一样SQL Server允许在一个列上重复创建索引。因为SQL Server没有限制创建重复索引的数量,只是限制数据库的一个表上最多可以创建999重复索引,所以这就增加了数据库中存在重复索引的可能性。表的列上存在重复索引的话,可能会明显的损害数据库性能,因为SQL Server必须分别维护每一个重复索引。此外,SQL Server优化查询语句时,查询优化器也会考虑这个问题,这就导致一系列性能问题。要理解什么事实重复索引、怎么样找到它们、怎么样移除它们。

 

2. 什么是重复索引

首先假设有一个表Test_Table有四个列(Col1, Col2, Col3, Col4)

CREATE TABLE Test_Table

1) 在主键列上创建不同类型的索引

   1: CREATE UNIQUE CLUSTERED INDEX IX1 ON Test_Table(Col1); 
   2:  
   3: CREATE INDEX IX2 ON Test_Table(Col1); 

2) 在非主键列上创建不同顺序的包含列的索引

   1: CREATE INDEX IX3 ON Test_Table (Col4) 
   2: INCLUDE (Col2, Col3); 
   3:  
   4: CREATE INDEX IX4 ON Test_Table (Col4) 
   5: INCLUDE (Col3, Col2); 

3) 在非主键列上创建相同顺序包含列的索引

   1: CREATE INDEX IX5 ON Test_Table (Col4) 
   2: INCLUDE (Col2, Col3); 
   3:  
   4: 
CREATE UNIQUE INDEX IX6 ON Test_Table (Col4)
   5: INCLUDE (Col2, Col3); 

4) 在不同非主键列创建不同顺序的索引

   1: CREATE INDEX IX7 ON Test_Table (Col3, Col2); 
   2:  
   3: 
CREATE INDEX IX8 ON Test_Table (Col3, Col2);

这样重复的索引,在执行DML操作(插入、更新、删除)的时候需要更新索引。

 

3. 查找重复索引

一般不会有人特意创建重复索引。有时候,神不知鬼不觉的创建了,有时候 是因为创建新的索引是没有检查当前列是否已经存在索引。那么怎么样才能它们暴露来呢?

1) 使用SQL Server Management Studio (SSMS,但是在SQL Server有很多数据库,数据库中又有大量表和索引的情况下,使用SSMS并不是一个快捷的方式。

2) 使用sp_helpindex查找重复索引

3) 使用SQL Server系统目录,可以在SQL Server数据库上使用和开发脚本查找重复索引,这是一个比较方便并灵活的方式。

SQL系统目录:

a. sys.indexes:包括表格对象(例如,表、视图或表值函数)的索引或堆的每一行

b. sys.objects:在数据库中创建的每个用户定义的架构作用域内的对象在该表中均对应一行。

c. sys.index_columns:属于 sys.indexes 索引或未排序的表(堆)的每个列都对应一行。

d. sys.columns:返回包含列对象(如视图或表)的列的每一行

下面是包含列对象类型的表:

a) 表值程序集函数 (FT)

b) 内联表值 SQL 函数 (IF)

c) 内部表 (IT)

d) 系统表 (S)

e) 表值 SQL 函数 (TF)

f) 用户表 (U)

g) 视图 (V)

有一种是列出所有索引在哪个表上面,它们被扫描多少次,被更新多少次,在内存中的大小, 这些对我们有用的信息

View

还有一种是基于列查找重复索引

View

4. 删除重复索引

把它们暴露出来,剩下的事情就很简单了,删除。

   1: USE test_table; 
   2: GO 
   3: --从表Test_Tabler删除索引 IX2 
   4: DROP IX2 
   5: ON Test_Tabler 
   6: GO 

 

5. 总结

设计数据库查询语句时,需要相当的留意重复索引可能引起DML操作的性能降低。设计新数据库之前最好检查一下已有数据库的索引。在自己的数据库发现重复索引,明智的选择就是果断删除它,删除之前最好还是先做数据库备份,这样可以避免删除后对数据库造成重大影响。其实,删除重复索引不仅能提高性能而且可以给数据库瘦身,同时备份文件也会变小。

原文地址:https://www.cnblogs.com/BoyceYang/p/3139006.html