トランザクションシステムでは、クエリオプティマイザがおそらくそれを使用しないため、そのような列(つまり、低カーディナリティ参照列)にインデックスを置くことに大きなメリットはありません。また、索引を更新する必要があるため、表への書込み時に追加のディスク・トラフィックも生成されます。したがって、トランザクションデータベースのカーディナリティFKが低い場合、通常は列のインデックスを作成しないほうがよいでしょう。これは特に大量生産システムに適用されます。
参照整合性のためにFKを依然として使用していて、ルックアップテーブルがほとんど常にキャッシュされるため、小さな参照テーブルのFK参照でI/Oが生成されない可能性があることに注意してください。
しかし、何らかの理由で複合インデックスに列を含めることができます。おそらく、一般的に使用されるクエリのカバーインデックスを作成することができます。
バルクロードが頻繁に行われるテーブル(データウェアハウスなど)では、インデックス付きの列が多数ある場合、インデックス書き込みトラフィックはテーブルの負荷よりもはるかに大きくなります。索引が存在する場合は、バルク・ロードのためにFKと索引をドロップまたは使用不可にする必要があります。
スタースキーマでは、SQL Server上であっても、カーディナリティの低い列にインデックスを付けることでいくつかの利点が得られます。高度に選択的なクエリ(つまり、クエリオプティマイザが返した行集合が小さいと判断したクエリ)を実行する場合、インデックス交差と呼ばれる手法を使用する「スタークエリ」プランを実行できます。
一般に、スター・スキーマの問合せ計画は、ファクト表の表スキャン、またはファクト表をブックマークしてより小さな行セットを戻す高度に選択的なプロセスに基づいている必要があります。ファクト表のI/Oを実行する前に選択を解決できるので、後者のタイプの問合せでは索引の交差が効率的です。
ビットマップ索引は、それらをサポートするOracleなどのプラットフォームでは、カーディナリティの低い列に対して実際のメリットがありますが、SQL Serverにはありません。それでも、SQL Serverのスタークエリプランには、低カーディナリティインデックスが引き続き参加できます。
SQLの専門家を引用するには:「(プライマリ)キーがない場合はテーブルではありません」 - そのような小さいルックアップテーブルでも*常にプライマリキーが必要です。 –