sql >> データベース >  >> RDS >> Sqlserver

冗長インデックスを見つけるためのT-SQL

    冗長性が維持されない状況があります。たとえば、ColumnCと言います 巨大なフィールドでしたが、すぐに取得する必要がある場合があります。 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
    

    パフォーマンスが「予期せず」低下した場合に備えて、ユーザーにケーキを持参してください:-)



    1. SonarQube:measures_data.ibdのサイズを減らす方法は?

    2. JDBCを使用してMySQLサーバーにpingを実行する

    3. mySQL:配列へのサブクエリ?

    4. InnoDBテーブルはMySQLに存在しますが、データベースを新しいサーバーにコピーした後は存在しないと言います