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

SQLServerヒープv.s.クラスター化されたインデックス

    ヒープストレージは、これらのヒープ とは何の関係もありません。 。

    ヒープとは、レコード自体が順序付けられていない(つまり、相互にリンクされていない)ことを意味します。

    レコードを挿入すると、データベースが検出した空き領域にレコードが挿入されるだけです。

    ヒープベースのテーブルの行を更新しても、他のレコードには影響しません(ただし、セカンダリインデックスには影響します)

    HEAPにセカンダリインデックスを作成する場合 テーブル、RID (ストレージスペースへの一種の物理ポインタ)は行ポインタとして使用されます。

    クラスター化されたインデックスは、レコードがB-Treeの一部であることを意味します 。レコードを挿入すると、B-Tree 再リンクする必要があります。

    クラスター化されたテーブルの行を更新すると、Bツリーが再リンクされます。 e。他のレコードの内部ポインタを更新します。

    クラスター化テーブルにセカンダリインデックスを作成する場合、クラスター化インデックスキーの値が行ポインタとして使用されます。

    これは、クラスター化されたインデックスが一意である必要があることを意味します。クラスター化インデックスが一意でない場合は、uniquifierと呼ばれる特別な非表示列 一意の場合(およびサイズが大きい場合)を作成するインデックスキーに追加されます。

    また、列にセカンダリインデックスを作成すると、値またはクラスター化インデックスのキーがセカンダリインデックスのキーの一部になることにも注意してください。

    クラスター化されたテーブルにインデックスを作成することにより、実際には常に複合インデックスを取得します

    CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)
    
    CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)
    

    インデックスIX_mytable_5678 実際には、次の列のインデックスです:

    col5
    col6
    col7
    col8
    col1
    col2
    col3
    col4
    

    これにはもう1つの副作用があります:

    DESC クラスター化テーブルの単一列インデックスの条件は、SQL Serverでは意味があります

    このインデックス:

    CREATE INDEX IX_mytable ON mytable (col1)
    

    次のようなクエリで使用できます:

    SELECT  TOP 100 *
    FROM    mytable
    ORDER BY
           col1, id
    

    、これは:

    CREATE INDEX IX_mytable ON mytable (col1 DESC)
    

    次のようなクエリで使用できます:

    SELECT  TOP 100 *
    FROM    mytable
    ORDER BY
           col1, id DESC
    


    1. データベースプロシージャがアプリケーションから何度も呼び出されたときにパフォーマンスが影響するかどうか。

    2. Mysqlクエリの発行日から7日を引いたもの

    3. PostgreSQLでアドホックスクリプトを実行するにはどうすればよいですか?

    4. ストアドプロシージャを使用してMySQLのテーブルをシャッフルします