T-SQL для нахождения Избыточных Индексов

Кто-либо знает о сценарии T-SQL, который может обнаружить избыточные индексы через всю базу данных? Пример избыточного индекса в таблице был бы следующие:

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

Игнорируя другие соображения, такие как ширина столбцов и покрывая индексы, Индекс 2 был бы избыточен.

Спасибо.

6
задан Randy Minder 19 July 2010 в 18:21
поделиться

1 ответ

Бывают ситуации, когда избыточность не сохраняется. Например, скажем, ColumnC было огромным полем, но иногда вам приходилось получать его быстро. Ваш индекс 1 не потребует поиска по ключу для:

select ColumnC from YourTable where ColumnnA = 12

С другой стороны индекс 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

Принесите торт своим пользователям, если производительность снизится «неожиданно»: -)

11
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: