Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

T-SQL zum Auffinden redundanter Indizes

Es gibt Situationen, in denen die Redundanz nicht gilt. Sagen Sie zum Beispiel ColumnC war ein riesiges Feld, aber man musste es manchmal schnell abrufen. Ihr index 1 würde keine Schlüsselsuche erfordern für:

select ColumnC from YourTable where ColumnnA = 12

Andererseits index 2 ist viel kleiner, sodass es für Abfragen, die einen Index-Scan erfordern, im Speicher gelesen werden kann:

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

Sie sind also nicht wirklich überflüssig.

Wenn Sie mein obiges Argument nicht überzeugt, finden Sie "redundante" Indizes wie:

;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

Bringen Sie Kuchen für Ihre Benutzer mit, falls die Leistung "unerwartet" nachlässt :-)