1

3 つのテーブルを持つ OLTP アプリケーションがあります

Item Table - ItemId, CategoryId, AgeGroupId, ... 100K rows. 

CategoryTable - CategoryId, ...  (only 5-10 rows)
AgeGroupTable - AgeGroupId, ...  (only 4-5 rows) 

Item テーブルのCategoryId適切なインデックスは何ですか? それらのいずれかまたは両方でAgeGroupId項目を照会するとよいでしょう。CategoryAgegroup

カーディナリティが低いため、ビットマップ インデックスが機能する可能性があると考えていましたが、テーブルごとに複数のビットマップ インデックスがどのように機能するのか正確にはわかりません。水平分割はどのように役立ちますか?

4

3 に答える 3

2

これはコメントとして始まりましたが、長くなりすぎています。

CategoryId と AgeGroupId の適切なインデックスは何ですか?

どのような文脈で?サンプル スキーマでは、両方のデータ ドメインが主キーおよび外部キーとして表示されます。しかし、これは論外です。

実際に値を追加する場所にのみインデックスを追加する必要があります。各テーブルの行数が 10 行未満の場合、データが非常に歪んでいない限り、どちらのドメインにもインデックスを作成するメリットはまったくありません。挿入/更新は遅くなり、そのようなインデックスを介したデータへのアクセスは、3 つのテーブルのそれぞれでフル テーブル スキャンを実行するよりも遅くなります。

item テーブル内の他の属性間に暗黙的な関係がある可能性があるため、ドメインを他のインデックスに追加することは理にかなっていますが (ただし、先頭に追加することはできません)、データとそれに対して実行されるクエリについて詳しく知らなければ、無視します。とりあえずこれ。

于 2012-12-09T23:53:40.487 に答える
2

これは OLTP アプリケーションであるため、ほとんどの場合、ビットマップ インデックスは使用したくないでしょう。ビットマップ インデックスは、OLTP アプリケーションではうまく機能しない傾向があります。データに対して多くの単一行操作を行うと、サイズが非常に急速に大きくなる傾向があります (ただし、この影響は最近のバージョンでは軽減されています)。しかし、より重要なことは、ロックの影響により、アプリケーションのスケーラビリティが大幅に低下する傾向があることです。たとえば、にビットマップ インデックスがある場合CategoryID、単一の行を更新するには、ソースまたはターゲット値のいずれか CategoryIDを持つテーブル内のすべての行を事実上ロックする必要があります。CategoryID

せいぜい、( AgeGroupID, CategoryID) と ( CategoryID, ) の複合インデックスが必要なようですAgeGroupIDAgeGroupID場合によっては、( , )で複合インデックスのみをCategoryID使用し、 のみが指定されている場合に Oracle にインデックス スキップ スキャンを使用させることができCategoryIDます。それは、作成するトレードオフによって異なります。複数のインデックスを使用するCategoryIDと、DML 操作での追加のインデックス メンテナンスと追加のディスク領域の使用を犠牲にして、クエリがより効率的になります。

パーティショニングを使用するライセンスはありますか? これは、エンタープライズ エディションのライセンスに追加される追加料金のオプションです。おそらく、テーブルを分割できると思います。ただし、わずか 100,000 行のテーブルは、パーティショニングを検討するにはかなり小さいものです。また、どのようにパーティション分割しても、パーティション キーを使用しないクエリの効率が低下する傾向があります。指定するクエリが(またはその逆)AgeGroupIDよりもはるかに一般的であることがわかっている場合、それは理にかなっているかもしれませんが、それはあなたが説明しているようには聞こえません。CategoryID

于 2012-12-10T03:08:39.467 に答える
0

それは、クエリがどのように見えるかに大きく依存します。常に一度に 1 つの列のみをフィルター処理または結合する場合は、ビットマップ インデックスが適切に機能します。両方の列に基づいてフィルタリングまたは結合する場合は、複合インデックスも機能します。

私の経験では、確実に知る最善の方法は、両方のオプションをテストすることです。テーブルに複数のビットマップ インデックスを配置したり、複合インデックスを使用したりすることに成功しました。テーブルに 100K 行しかないため、インデックスを非常に迅速に作成および削除できるはずです。次に、さまざまなインデックスのセットを使用して、最も一般的なクエリをテストできます。

于 2012-12-10T02:17:11.370 に答える