web-dev-qa-db-ja.com

データベーステーブルのインデックスの欠点は何ですか?

パフォーマンスを向上させるために、データベーステーブルごとにインデックスを作成するべきではない理由はありますか?何らかの理由があるように思われますが、それ以外の場合、すべてのテーブルにはデフォルトで自動的に1つがあります。

MS SQL Server 2016を使用しています。

11
Stpete111

テーブルの1つのインデックスは大した問題ではありません。主キーまたは一意として宣言された列(または列の組み合わせ)に自動的にインデックスが作成されます。

インデックスにはある程度のオーバーヘッドがあります。インデックス自体がディスクとメモリのスペースを使用します(使用する場合)。したがって、スペースやメモリに問題がある場合は、インデックスが多すぎることが問題になる可能性があります。データが挿入/更新/削除されると、元のデータだけでなくインデックスも維持する必要があります。これにより、更新が遅くなり、テーブル(またはテーブルの一部)がロックされ、クエリ処理に影響する可能性があります。

各テーブルの少数のインデックスが妥当です。これらは、一般的なクエリの負荷を考慮して設計する必要があります。すべてのテーブルのすべての列にインデックスを付けると、データの変更が遅くなります。データが静的である場合、これは問題ではありません。ただし、インデックスを使用してすべてのメモリを使い果たすことは問題になる可能性があります。

19
Gordon Linoff

最低でも、通常はテーブルごとに少なくとも1つのインデックスを作成することをお勧めします。これは、IDENTITY列などのテーブルの主キーに自動的に作成されます。次に、通常、外部キーはインデックスの恩恵を受けます。これは手動で作成する必要があります。特にWHERE句に頻繁に含まれる他の列には、一意の値が多数含まれている場合は特に、インデックスを作成する必要があります。これに2つの値しかない場合の性別(低カーディナリティ)などの列にインデックスを付けることの利点については、議論の余地があります。データベース内のほとんどのテーブルには、テーブル内のデータとこのデータの取得方法に応じて、1〜4のインデックスがあります。

0
Tim Newton