博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5.3 查找缺失的索引
阅读量:4171 次
发布时间:2019-05-26

本文共 2316 字,大约阅读时间需要 7 分钟。

5.3 查找缺失的索引

索引的好处,大部分人都知道,但是索引也是有坏处的。对于SQL Server中的索引(甚至一切数据库管理系统,再甚至世间绝大部分事物)而言,并没有绝对的好或者绝对的坏。合适最主要。索引过多会导致update,delete,insert性能问题。索引过少会导致查询慢    CPU多,IO多,全表扫描。

对于核心表:所有索引不要超过6个。

对于普通表:所有索引不要超过4个。

对于小型表:所有索引不要超过3个。

5.3.1 查找缺失的索引需要的表

在生产系统中很难总是可以在合适的列上创建合适的索引。SQL2008以后,当一个查询执行的时候,SQLServer优化器会选择最适合的索引进行执行,当没有找到合适的索引话,优化器会产生一个次优执行计划,并且把丢失索引的信息存放到DMVs上。

当SQLServer服务重启后,所以存储在DMVs上的信息都会丢失,所以最好在正常使用大概90天收集这些信息,会比较有效。但是不能全部建立索引,有些索引是也许90天才使用一次,建立索引要适当。

 

sys.dm_db_missing_index_details:返回关于丢失索引的详细信息。

sys.dm_db_missing_index_group_stats:返回特定索引的汇总信息。

sys.dm_db_missing_index_groups:返回关于哪个丢失索引包含在哪个丢失索引组的句柄信息。

sys.dm_db_missing_index_columns(index_Handle):返回在丢失索引中列的信息。

主要字段说明

 

avg_total_user_cost        可通过组中的索引减少的用户查询的平均成本。

avg_user_impact             实现此缺失索引组后,用户查询可能获得的平均百分比收益。 该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。

user_seeks        由可能使用了组中建议索引的用户查询所导致的查找次数。

user_scans 由可能使用了组中建议索引的用户查询所导致的扫描次数。

index_handle:标识特定的缺失索引。 该标识符在服务器中是唯一

group_handle:标识缺失索引组,一个索引组仅包含一个索引。

5.3.2 查找缺失的索引

 查找缺失的索引的表和列

SELECT mig.*, statement AS table_name, 

    column_id, column_name, column_usage 

FROM sys.dm_db_missing_index_details AS mid 

CROSS APPLY sys.dm_db_missing_index_columns (mid.index_handle) 

INNER JOIN sys.dm_db_missing_index_groups AS mig ON mig.index_handle = mid.index_handle 

ORDER BY mig.index_group_handle, mig.index_handle, column_id; 

 

查找缺失索引最多的

SELECT TOP 10 * 

FROM sys.dm_db_missing_index_group_stats 

ORDER BY avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)DESC; 

 

组合查询

SELECT  avg_total_user_cost * avg_user_impact * ( user_scans + user_seeks ) AS  PossibleImprovement ,

        last_user_seek ,

        last_user_scan ,

        [statement] AS [Object] ,

        'CREATE INDEX [IDX_' + CONVERT(VARCHAR(32), GS.group_handle) + '_'

        + CONVERT(VARCHAR(32), D.index_handle) + '_'

        + REPLACE(REPLACE(REPLACE([STATEMENT], ']', ''), '[', ''), '.', '')

        + ']' + ' 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_groups AS G

        INNER JOIN sys.dm_db_missing_index_group_stats AS GS ON G.index_group_handle = GS.group_handle

        INNER JOIN sys.dm_db_missing_index_details AS D ON G.index_handle = D.index_handle

ORDER BY PossibleImprovement DESC

转载地址:http://lobai.baihongyu.com/

你可能感兴趣的文章
阿里P8架构师讲述:3—5年程序员的发展和出路在哪里?
查看>>
题库分库分表架构方案
查看>>
一篇文读懂缓存在大型分布式系统中的最佳应用
查看>>
当亲戚问你工资,程序猿如何作答,简直不能再机智
查看>>
Redis从单机到集群,一步步教你环境部署以及使用
查看>>
电商平台备战促销季的运维秘诀——高可用服务层
查看>>
从零开始实现RPC框架 - RPC原理及实现
查看>>
MySQL索引优化分析
查看>>
RabbitMQ分布式集群架构
查看>>
MySQL每秒57万的写入,带你飞~
查看>>
Java系统高并发的解决方案
查看>>
学习分布式系统需要怎样的知识?
查看>>
一网打尽消息队列在大型分布式系统中的实战精髓
查看>>
阿里巴巴系统架构首次曝光
查看>>
从构建分布式秒杀系统聊聊限流特技
查看>>
Java设计模式——命令模式
查看>>
Java进阶架构师之如何画好架构图?阿里大神手把手教你!
查看>>
你绝对需要了解的Spring学习笔记
查看>>
一遍记住Java常用的八种排序算法与代码实现
查看>>
工作4年从美团、360、陌陌、百度、阿里、京东面试回来感想
查看>>