次のような 1 億行を超えるテーブルがいくつかあるゲノム データの Oracle 10g データベースがあります。
ID AssayID Sample Mutation Call Frequency
101 12578 Sample01 T367G P 0.87
102 31384 Sample01 A2345C A 0.28
103 3453 Sample01 T247C P 0.67
104 12578 Sample02 G235del M 0.11
105 7868 Sample02 None P 0.98
IDは一意の PK でAssayIDありSample、外部キーです。- 値ごと
Sampleに最大 50,000 行あると仮定します。 - それぞれ
AssayIDが ごとに 1 回だけ発生しますSample。 Mutationは比較的ランダムでCall、3 つの値のいずれかになります。AssayIDこのテーブルのクエリでは、 、Sample、Mutation、 、または と を介してCallリンクされたテーブルの値のいずれかまたは組み合わせを使用できます。AssayIDSample
典型的なクエリ:
select t.*
from this_table t
join assay_table a on t.assayid = a.assayid
join sample_table s on t.sample = s.sample
where
s.name = 'xxx' and a.gene in ('abc', 'xyz') and t.call = 'P'
- これらのテーブルに対するクエリは、常に複数の小さなテーブルを結合します。
- 通常、
WHEREステートメントは複数の列のデータをフィルター処理しますが、ベース データ テーブルのみからフィルター処理することはありません。
すべての列を選択するときに最高のクエリ パフォーマンスを得るには、どのようにテーブルを設計すればよいですか?
インデックスのみ、パーティションのみ、または 2 つの組み合わせのどれを使用しますか? ディスク容量と挿入/更新のパフォーマンスは問題になりません。