sql >> Database >  >> RDS >> Sqlserver

T-SQL voor het vinden van redundante indexen

Er zijn situaties waarin de redundantie niet geldt. Zeg bijvoorbeeld ColumnC was een enorm veld, maar je moest het soms snel terughalen. Uw index 1 zou geen sleutelzoekopdracht vereisen voor:

select ColumnC from YourTable where ColumnnA = 12

Aan de andere kant index 2 is veel kleiner, zodat het in het geheugen kan worden gelezen voor zoekopdrachten die een indexscan vereisen:

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

Ze zijn dus niet echt overbodig.

Als je niet overtuigd bent door mijn bovenstaande argument, kun je "redundante" indexen vinden zoals:

;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

Breng taart voor uw gebruikers voor het geval de prestaties "onverwacht" afnemen :-)



  1. Hoe Mysql Race-voorwaarden op de juiste manier te vermijden?

  2. Een tabel maken op basis van een query met een andere tabelruimte (Oracle SQL)

  3. Resultaten van een Mysql-query exporteren naar Excel?

  4. Wat gebeurt er met duplicaten bij het invoegen van meerdere rijen?