• 获取当某个表所有索引使用情况


    DECLARE @dbName   SYSNAME
      ,@schemaName SYSNAME
      ,@ObjectName SYSNAME
      ,@sql   NVARCHAR(max)
    SELECT @dbName='DBname'
      ,@schemaName='dbo'
      ,@ObjectName='tablename'


    SET @sql='SELECT COUNT(1) AS DataCount FROM '+@dbName+'.'+@schemaName+'.'+@ObjectName+' WITH (NOLOCK)'

    EXEC sp_executesql @sql


    ;with data
    as (

    SELECT
      DB_NAME(A.database_id)
       +'.'+SCHEMA_NAME(C.schema_id)
       +'.'+OBJECT_NAME(A.object_id) AS TableName
      ,B.Name AS IndexName
      ,D.Name AS ColumnName
      ,A.user_seeks AS IndexSeek
      ,A.user_scans AS IndexScan
      ,A.user_lookups AS IndexKeyLook
      ,A.user_updates AS IndexUpdate
      ,CAST(CAST(A.user_seeks*100.00/CASE WHEN (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates)=0 THEN 1 else (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates) end
        AS decimal(6,2))
       AS VARCHAR(6))+'%' AS IndexSeekPersent
      ,CAST(CAST(A.user_scans*100.00/CASE when (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates) =0 then 1 else (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates) end
        AS decimal(6,2))
       AS VARCHAR(6))+'%' AS IndexScanPersent
      ,CAST(CAST(A.user_lookups*100.00/ case when (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates) =0 then 1 else (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates) end
        AS decimal(6,2))
       AS VARCHAR(6))+'%' AS IndexKeyLookPersent
      ,CAST(CAST(A.user_updates*100.00/case when (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates) = 0 then 1 else (A.user_seeks+A.user_scans+A.user_lookups+A.user_updates) end
        AS decimal(6,2))
       AS VARCHAR(6))+'%' AS IndexUpdatePersent
    FROM sys.dm_db_index_usage_stats AS A WITH (NOLOCK)
     INNER JOIN sys.indexes AS B WITH (nolock)
     ON A.index_id=B.index_id
     INNER JOIN sys.tables AS C WITH (NOLOCK)
     ON B.object_id=C.object_id
      AND A.object_id=C.object_id
     INNER JOIN sys.columns AS D WITH (NOLOCK)
     ON A.object_id=D.object_id
     INNER JOIN sys.index_columns AS E WITH (NOLOCK)
     ON B.index_id=E.index_id
      AND D.column_id=E.column_id
      AND A.object_id=E.object_id
    WHERE DB_NAME(A.database_id)= @dbName
      AND OBJECT_NAME(A.object_id) = @ObjectName
      AND OBJECT_NAME(A.object_id) not like '%Subscription%' --排除Replication相关的系统表
      AND B.is_primary_key = 0   --排除PK
      AND SCHEMA_NAME(C.schema_id)=@schemaName
      AND B.name IS NOT NULL
      AND B.is_disabled=0
      AND B.is_hypothetical=0
    )


    select *
    from data
    where (cast(replace(IndexSeekPersent,'%','') as decimal(6,2)) <= 0.1
      or cast(replace(IndexUpdatePersent,'%','') as decimal(6,2)) >=0.9)
      and
      IndexSeek + IndexScan + IndexKeyLook + IndexUpdate <>0
    ORDER BY cast(replace(IndexUpdatePersent,'%','') as decimal(6,2)) DESC
    --IndexSeek  DESC
    --  ,IndexScan  DESC
    --  ,IndexKeyLook DESC
    --  ,IndexUpdate DESC


    select o.name ,i.name ,i.type from

    sys.indexes i inner join sys.objects o on i.object_id = o.object_id

    inner join sys.partitions p on p.index_id = i.index_id and p.object_id = i.object_id

    where p.partition_id = 72057594065518592

  • 相关阅读:
    第 9 章 类
    导入模块
    第 8 章 函数
    第七章 用户输入和while语句
    第六章 字典
    测试经理/组长职责
    测试的发展之路
    【转】测试流程
    一个网页通用的测试用例(借鉴他人的保存,加注释)
    QTP自动化测试框架简述
  • 原文地址:https://www.cnblogs.com/qanholas/p/3415686.html
Copyright © 2020-2023  润新知