sqlserver查看索引使用情况以及建立丢失的索引

--查看表的索引使用情况
SELECT TOP 1000
o.name AS 表名
, i.name AS 索引名
, i.index_id AS 索引id
, dm_ius.user_seeks AS 搜索次数
, dm_ius.user_scans AS 扫描次数
, dm_ius.user_lookups AS 查找次数
, dm_ius.user_updates AS 更新次数
, p.TableRows as 表行数
, ‘DROP INDEX ‘ + QUOTENAME(i.name)
+ ‘ ON ‘ + QUOTENAME(s.name) + ‘.‘ + QUOTENAME(OBJECT_NAME(dm_ius.OBJECT_ID)) AS ‘删除语句‘
FROM sys.dm_db_index_usage_stats dm_ius
INNER JOIN sys.indexes i ON i.index_id = dm_ius.index_id AND dm_ius.OBJECT_ID = i.OBJECT_ID
INNER JOIN sys.objects o ON dm_ius.OBJECT_ID = o.OBJECT_ID
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
INNER JOIN (SELECT SUM(p.rows) TableRows, p.index_id, p.OBJECT_ID
FROM sys.partitions p GROUP BY p.index_id, p.OBJECT_ID) p
ON p.index_id = dm_ius.index_id AND dm_ius.OBJECT_ID = p.OBJECT_ID
WHERE OBJECTPROPERTY(dm_ius.OBJECT_ID,‘IsUserTable‘) = 1
AND dm_ius.database_id = DB_ID()
--AND i.type_desc = ‘nonclustered‘--这里指定了索引的类型,聚集索引或者非聚集索引
AND i.is_primary_key = 0
AND i.is_unique_constraint = 0
and o.name=‘testtable‘   --需要查找的表名
ORDER BY (dm_ius.user_seeks + dm_ius.user_scans + dm_ius.user_lookups) ASC

--查看数据库里表丢失的索引并生成建立索引的语句
SELECT t4.name,t1.[statement],t1.object_id, t2.user_seeks, t2.user_scans,
       t1.equality_columns, t1.inequality_columns,t1.included_columns,
    case 
       --when t1.equality_columns is null and charindex(‘,‘,t1.inequality_columns)=0 and t1.included_columns is null
       --    then   ‘create UNIQUE NONCLUSTERED INDEX IX_‘ + replace((replace((replace(t1.[statement],‘[‘,‘_‘)),‘]‘,‘_‘)),‘.‘,‘_‘) +‘_‘+ replace((replace((replace(isnull(t1.equality_columns,‘1‘),‘[‘,‘_‘)),‘]‘,‘_‘)),‘.‘,‘_‘) +‘_‘ 
       --           +replace((replace((replace(isnull(t1.inequality_columns,‘_2‘),‘[‘,‘_‘)),‘]‘,‘_‘)),‘.‘,‘_‘) + ‘ ON ‘+ t1.[statement] + ‘ (‘ + t1.inequality_columns + ‘ ASC )‘  
       when --t1.equality_columns is null and charindex(‘,‘,t1.inequality_columns)>0 and
       t1.included_columns is null
           then   ‘create  NONCLUSTERED INDEX IX_‘ + replace((replace((replace((replace(t1.[statement],‘[‘,‘_‘)),‘]‘,‘_‘)),‘.‘,‘_‘)),‘,‘,‘_‘) +‘_‘  
                  +replace(replace(replace(replace(replace(isnull(t1.equality_columns,‘2‘),‘ [‘,‘‘),‘[‘,‘‘),‘.‘,‘‘),‘,‘,‘‘),‘]‘,‘‘)
  +replace((replace((replace((replace(isnull(t1.inequality_columns,‘2‘),‘[‘,‘‘)),‘]‘,‘‘)),‘.‘,‘‘)),‘,‘,‘_‘) + ‘ ON ‘+ t1.[statement] + ‘ (‘ + 
    case  when t1.equality_columns is null then ‘ ‘
          when charindex(‘,‘,t1.equality_columns)=0 then t1.equality_columns +‘ ASC ‘
  when charindex(‘,‘,t1.equality_columns)>0 then replace(t1.equality_columns,‘,‘,‘ ASC,‘) + ‘ ASC ‘ 
 end
       +   
    case  when t1.equality_columns is not null and charindex(‘,‘,t1.inequality_columns)=0 then  ‘ ,‘+t1.inequality_columns + ‘ ASC )‘
when t1.equality_columns is null and charindex(‘,‘,t1.inequality_columns)=0 then  ‘ ‘+t1.inequality_columns + ‘ ASC )‘
  when  t1.inequality_columns is null then ‘ )‘
  when charindex(‘,‘,t1.inequality_columns) > 0 then ‘ ,‘+ replace(t1.inequality_columns,‘,‘,‘ ASC,‘) + ‘ ASC )‘ 
  when  t1.equality_columns is null and charindex(‘,‘,t1.inequality_columns) > 0 then ‘ ‘+ replace(t1.inequality_columns,‘,‘,‘ ASC,‘) + ‘ ASC )‘
     end
   when t1.included_columns is not null
        then   ‘create NONCLUSTERED INDEX IX_‘ + replace((replace((replace((replace(t1.[statement],‘[‘,‘_‘)),‘]‘,‘_‘)),‘.‘,‘_‘)),‘,‘,‘_‘) +‘_‘  
                  +replace(replace(replace(replace(replace(isnull(t1.equality_columns,‘2‘),‘ [‘,‘‘),‘[‘,‘‘),‘.‘,‘‘),‘,‘,‘‘),‘]‘,‘‘)
  +replace((replace((replace((replace(replace(isnull(t1.inequality_columns,‘2‘),‘ [‘,‘‘),‘[‘,‘‘)),‘]‘,‘‘)),‘.‘,‘‘)),‘,‘,‘_‘) + ‘ ON ‘+ t1.[statement] + ‘ (‘ + 
    case  when t1.equality_columns is null then ‘ ‘
          when charindex(‘,‘,t1.equality_columns) = 0 then t1.equality_columns +‘ ASC ‘
  when charindex(‘,‘,t1.equality_columns) > 0 then replace(t1.equality_columns,‘,‘,‘ ASC,‘) + ‘ ASC ‘ 
 end
       +   
    case  when  t1.equality_columns is not null and charindex(‘,‘,t1.inequality_columns)=0 then ‘ ,‘+t1.inequality_columns + ‘ ASC )‘
when  t1.equality_columns is null and charindex(‘,‘,t1.inequality_columns)=0 then ‘ ‘+t1.inequality_columns + ‘ ASC )‘
  when  t1.inequality_columns is null then ‘ )‘
  when  t1.equality_columns is not null and charindex(‘,‘,t1.inequality_columns) > 0 then ‘ ,‘+ replace(t1.inequality_columns,‘,‘,‘ ASC,‘) + ‘ ASC )‘ 
  when  t1.equality_columns is null and charindex(‘,‘,t1.inequality_columns) > 0 then ‘ ‘+ replace(t1.inequality_columns,‘,‘,‘ ASC,‘) + ‘ ASC )‘ 
     end
  + ‘ INCLUDE ( ‘ + t1.included_columns + ‘ )‘
   
    end  as  ‘建立索引的语句‘

FROM sys.dm_db_missing_index_groups AS t3
      join sys.dm_db_missing_index_details AS t1
       on  t1.index_handle = t3.index_handle
          join sys.dm_db_missing_index_group_stats AS t2
            on t2.group_handle = t3.index_group_handle
              join sys.databases AS t4 
                on t1.database_id = t4.database_id
      WHERE t1.database_id = DB_ID() --AND object_id = OBJECT_ID(‘interface.商户设备表‘)
      order by t2.user_seeks desc 
      
      --t4.name,t1.object_id

sqlserver查看索引使用情况以及建立丢失的索引

时间: 2024-10-18 07:54:53

sqlserver查看索引使用情况以及建立丢失的索引的相关文章

mysql如何查看索引使用情况以及优化 - guols0612

mysql中支持hash和btree索引.innodb和myisam只支持btree索引,而memory和heap存储引擎可以支持hash和btree索引 我们可以通过下面语句查询当前索引使用情况: show status like '%Handler_read%'; +-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| Handler_read_first | 0

mysql如何查看索引使用情况以及优化

mysql中支持hash和btree索引.innodb和myisam只支持btree索引,而memory和heap存储引擎可以支持hash和btree索引 我们可以通过下面语句查询当前索引使用情况: show status like '%Handler_read%'; +-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| Handler_read_first | 0

mysql 查看索引使用情况

show status like 'Handler_read%'; Handler_read_key  代表着一个行被索引值读取的次数,值很低表明索引不经常用到,增加索引对性能改善不高. Handler_read_rnd_text  代表着在数据文件中读取下一行的请求数,如果进行大量的表扫描,Handler_read_rnd_next的会很高,说明表索引不正确或写入的查询没有利用索引.

sqlserver锁机制详解(sqlserver查看锁)

简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于 大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那 样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要锁 在开始谈锁之前,首先要简单了解一下事

在数据库查询中不走索引的情况与压力测试

重点关注: 1) 没有查询条件,或者查询条件没有建立索引 例如: select * from tab; 全表扫描. select * from tab where 1=1; 在业务数据库中,特别是数据量比较大的表.是没有全表扫描这种需求. 1.对用户查看是非常痛苦的. 2.对服务器来讲毁灭性的. 例如: select * from tab; SQL改写成以下语句: selec * from tab order by price limit 10 需要在price列上建立索引 select * f

MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引

mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表 代码如下: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  ); 我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找use

SQLServer查看和解决死锁的方法

在master数据库中新建以下存储过程 --处理死锁-- 查看当前进程,或死锁进程,并能自动杀掉死进程-- 因为是针对死的,所以如果有死锁进程,只能查看死锁进程-- 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程--调用示例 exec p_lockinfo create proc [dbo].[p_lockinfo]@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示@show_spid_if_nolock bit=1 --如果没有死锁的进程,

查看mysql库大小,表大小,索引大小

说明: 通过MySQL的 information_schema 数据库,可查询数据库中每个表占用的空间.表记录的行数:该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHEMA : 数据库名TABLE_NAME:表名ENGINE:所使用的存储引擎TABLES_ROWS:记录数DATA_LENGTH:数据大小INDEX_LENGTH:索引大小 其他字段请参考MySQL的手册,查看一个表占用空间的大小,那就相当于是 数据大小 + 索引大小 . 查看所有库的大小 mysql> u

如何正确建立MYSQL数据库索引

索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );   我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找username="admin"的记录