次のような 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
リンクされたテーブルの値のいずれかまたは組み合わせを使用できます。AssayID
Sample
典型的なクエリ:
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 つの組み合わせのどれを使用しますか? ディスク容量と挿入/更新のパフォーマンスは問題になりません。