最近、私が管理しているデータベースで、次の形式のインデックスに遭遇しました。
CREATE INDEX [IX_Foo] ON [Foo]
( Id ASC )
INCLUDE
( SubId )
この特定のケースでは、私が遭遇したパフォーマンスの問題 (Id と SubId の両方での低速な SELECT フィルタリング) は、SubId 列をインクルード列としてではなく、適切なインデックスに移動するだけで修正できました。
しかし、これは、一般に、それらが単にインデックス自体の一部である可能性がある場合に、含まれる列の背後にある理由をまったく理解していないと私に考えさせました。アイテムがインデックス自体に含まれていることを特に気にしなくても、単に含まれているのではなく、インデックスに列があることにはマイナス面があります。
いくつかの調査の後、インデックス付きの列に入れることができるものには多くの制限があることに気付きました (インデックスの最大幅、および「画像」のようにインデックスを作成できないいくつかの列の種類)。これらの場合、索引ページのデータに列を含める必要があることがわかります。
私が考えることができる唯一のことは、SubId に更新がある場合、列が含まれていれば行を再配置する必要がないということです (ただし、インデックスの値を変更する必要があります)。私が見逃しているものは他にありますか?
データベース内の他のインデックスを調べて、可能な場合は適切なインデックスに含まれる列をシフトすることを検討しています。これは間違いでしょうか?
私は主に MS SQL Server に興味がありますが、他の DB エンジンに関する情報も歓迎します。