zoukankan      html  css  js  c++  java
  • SQL Server 索引优化 ——索引缺失

    本文我们将重点给出动态视图法发现数据库中缺失的索引。对于索引的调整和新建将不在本文阐述范围,后续将陆续分享相关经验。

    sys.dm_db_missing_index_details 缺失索引明细,包括相等列,不等列以及包含列,执行如下脚本,并查看结果

    USE WideWorldImporters;
    GO
    SELECT * FROM sys.dm_db_missing_index_details;


    从结果可以看出,所有数据库中,缺失索引的表或索引视图都被列出来了。但是否需要把列出来的缺失索引都直接建上去呢?显然,这样做可能不但不能提升性能,还可能会导致性能下降。如,

    有些查询是偶发性的,使用率极低,而对应的表又有大量的插入、更新等;

    或者某些索引的创建对性能本身提升不多;

    又或者,缺失索引的列,在某些存储的索引中已经部分包含,按照缺失索引给出信息去创建,会造成索引冗余。

    结合以上情形,如果我们想补缺失索引,那么我们还需要知道缺失索引使用的频率,对性能的提升等信息。动态视图sys.dm_db_missing_index_group_stats 给出了我们需要的信息,下面我们给出缺失索引的状态

    SELECT OBJECT_NAME(m.OBJECT_ID) tableName,equality_columns,inequality_columns,included_columns
    ,unique_compiles,user_seeks,user_scans,avg_user_impact,avg_system_impact
    FROM sys.dm_db_missing_index_details m
    LEFT JOIN sys.dm_db_missing_index_groups g ON m.index_handle=g.index_handle
    LEFT JOIN sys.dm_db_missing_index_group_stats s ON g.index_group_handle=s.group_handle
    WHERE m.database_id=DB_ID();
    我们可以根据上面查询的结果,用户查找、用户扫描次数,用户性能影响,初步判断需要的索引。最终还要根据已经存在的索引,以及索引创建的一些规则,确定需要新创建的索引。

    创建角本:

    SELECT TOP 100
    statement AS 表 ,
    equality_columns AS 相等列 ,
    inequality_columns AS 不相等列 ,
    included_columns AS 包含列 ,
    user_scans + user_seeks AS 总查询次数 ,
    avg_user_impact AS 平均百分比收益 ,
    avg_total_user_cost AS 平均成本 ,
    avg_total_user_cost * avg_user_impact * ( user_scans + user_seeks ) AS 可能改进 ,

    'CREATE INDEX [IX_' + obj.name + '_'
    + CONVERT(VARCHAR(32), GS.group_handle) + '_'
    + CONVERT(VARCHAR(32), D.index_handle) + ']' + ' ON ' + [statement]
    + ' (' + ISNULL(equality_columns, '')
    + CASE WHEN equality_columns IS NOT NULL
    AND inequality_columns IS NOT NULL THEN ','
    ELSE ''
    END + ISNULL(inequality_columns, '') + ')' + ISNULL(' INCLUDE ('
    + included_columns
    + ')', '') AS Create_Index_Syntax
    FROM sys.dm_db_missing_index_details AS D
    INNER JOIN sys.dm_db_missing_index_groups G ON G.index_handle = D.index_handle
    INNER JOIN sys.dm_db_missing_index_group_stats GS ON G.index_group_handle = GS.group_handle
    INNER JOIN sys.objects AS obj ON obj.object_id = OBJECT_ID([statement])
    AND obj.type = 'U'

  • 相关阅读:
    VB.net byval和byref
    IOS 常用宏定义(二)
    目录权限Linux存储实验四:NFS的安装与配置
    服务器负载均衡nginx+keepalived 高可用负载均衡
    博客文件第二部分 Linux Shell高级编程技巧——第一章 深入讨论
    查看进程第二部分 Linux Shell高级编程技巧——第二章 Shell工具
    响应命令使用Ubuntu架设ftp服务器
    进程内存Linux下top命令
    客户端服务器SSH原理和使用
    安装数据空间虚拟CentOS访问Windows下共享文件
  • 原文地址:https://www.cnblogs.com/footleg/p/12053812.html
Copyright © 2011-2022 走看看