引言 一直以来,关于索引的常见问题是:判断哪部分索引对保证 数据库的良好性能是必需的。在本文中,笔者将提供针对该问题的 解决方案。本文用例中的所有代码都基于名为dm_db_missing_index_details 的 SQL Server 系统视图。
背景在开始安装前,进一步了解 dm_db_missing_index_details 会更有益处。 dm_db_missing_index_details 会返回缺失索引的细节信息。在本文中,我们将更关注以下几列: - index_handle:它是一个独特的跨服务器标识符,并且标志一个特定的缺失索引。
- equality_columns:包含用于相等谓词的所有列
- inequality_columns:包含用于其他比较的所有列
- included columns索引中所包含的查询必要出现列
- statement: 补充完整索引缺失的表名
实现本系统的实现基于以下三个实体: - 一个可以计算出待创建索引名称的简单函数
- 一个用于简化 dm_db_missing_index_details的用户视图
- 一个为每个索引创建声明的进程
笔者选择将这个系统分为三段进程,但实际上合并存储过程和视图也是可行的。笔者之所以没有选择后一种做法是因为想在创建索引之前先从业务逻辑检查一下存在哪些索引。
使用代码函数 fn_Index_CreateIndexName
在这个函数中,有三个输入参数: - @equality_columns
- @equality_columns
- @index_handlE
该函数的目的是为每个期望创建的索引都创建一个唯一名称。 [SQL] 纯文本查看 复制代码 CREATE FUNCTION [dbo].[fn_Index_CreateIndexName (@equality_columns NVARCHAR(4000), _
@Inequality_columns NVARCHAR(4000), @index_handlE INT) RETURNS VARCHAR(128)
AS
BEGIN
DECLARE @IndexName NVARCHAR(255)
SET @IndexName = ISNULL(@equality_columns,@Inequality_columns)
SET @IndexName = LTRIM(REPLACE(@IndexName,'[','_'))
SET @IndexName = RTRIM(REPLACE(@IndexName,']','_'))
SET @IndexName = REPLACE(@IndexName,',','')
SET @IndexName = REPLACE(@IndexName,'_ _','_')
IF LEN(@IndexName) > 120
BEGIN
SET @IndexName = SUBSTRING(@IndexName,0,120)
END
SET @IndexName = @IndexName + CAST(@index_handlE AS NVARCHAR(15))
RETURN @IndexName
END |