当前位置:  开发笔记 > 数据库 > 正文

用于查找冗余索引的T-SQL

如何解决《用于查找冗余索引的T-SQL》经验,为你挑选了1个好方法。

是否有人知道可以检测整个数据库中的冗余索引的T-SQL脚本?表中冗余索引的示例如下:

Index 1: 'ColumnA', 'ColumnB', 'ColumnC'
Index 2: 'ColumnA', 'ColumnB'

忽略其他注意事项,例如列的宽度和覆盖索引,索引2将是多余的.

谢谢.



1> Andomar..:

有些情况下冗余不成立.例如,假设ColumnC是一个huuge字段,但有时您必须快速检索它.您index 1不需要键查找:

select ColumnC from YourTable where ColumnnA = 12

另一方面index 2,它要小得多,因此可以在内存中读取需要索引扫描的查询:

select * from YourTable where ColumnnA like '%hello%'

所以他们并不是多余的.

如果您不相信我的上述论点,您可以找到"冗余"索引,例如:

;with ind as (
    select  a.object_id
    ,       a.index_id
    ,       cast(col_list.list as varchar(max)) as list
    from    (
            select  distinct object_id
            ,       index_id
            from    sys.index_columns
            ) a
    cross apply
            (
            select  cast(column_id as varchar(16)) + ',' as [text()]
            from    sys.index_columns b
            where   a.object_id = b.object_id
                    and a.index_id = b.index_id
            for xml path(''), type
            ) col_list (list)
)
select  object_name(a.object_id) as TableName
,       asi.name as FatherIndex
,       bsi.name as RedundantIndex
from    ind a
join    sys.sysindexes asi
on      asi.id = a.object_id
        and asi.indid = a.index_id
join    ind b
on      a.object_id = b.object_id
        and a.object_id = b.object_id
        and len(a.list) > len(b.list)
        and left(a.list, LEN(b.list)) = b.list
join    sys.sysindexes bsi
on      bsi.id = b.object_id
        and bsi.indid = b.index_id

为您的用户带来蛋糕,以防性能"意外"降低:-)


哇..给了Andomar的答案,因为我必须处理这样的态度......我当然感谢那些了解我的人,而不是花时间指出我可能没有考虑过的问题或实现.谢谢@Andomar
问题不在于我是否相信你.我的问题不是什么构成冗余索引.如果有更多的人会像发布的那样回答问题,而不是试图回答未被问到的问题,那将会很好.我只是想要一个查询,让我了解哪些索引可能是多余的,然后我们将评估每一个以决定采取什么操作.BTW - 很好的查询!
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有