作者: OneAPM
查看: 1257|回复: 3

[其他] 【数据库】缺失索引自动创建语句

[复制链接]
OneAPM 发表于 2016-4-18 13:35:26 | 显示全部楼层 |阅读模式
查看: 1257|回复: 3
引言
一直以来,关于索引的常见问题是:判断哪部分索引对保证数据库的良好性能是必需的。在本文中,笔者将提供针对该问题的解决方案。本文用例中的所有代码都基于名为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
回复 论坛版权

使用道具 举报

泥瓦匠 发表于 2016-4-28 14:22:20 | 显示全部楼层
没看明白!
回复

使用道具 举报

jhyjhy213 发表于 2019-10-11 08:48:36 | 显示全部楼层
感谢分享
回复

使用道具 举报

jhyjhy213 发表于 2019-10-24 09:23:52 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2020-7-9 19:25, Processed in 0.468001 second(s), 30 queries , Gzip On.

快速回复 返回顶部 返回列表