1

次のような 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このテーブルのクエリでは、 、SampleMutation、 、または と を介して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 つの組み合わせのどれを使用しますか? ディスク容量と挿入/更新のパフォーマンスは問題になりません。

4

2 に答える 2

1

最初のステップとして、Oracle のSQL Access Advisorを実行し、それが提供する推奨事項を確認できます。

于 2012-06-27T12:54:26.350 に答える
0

インデックスとパーティションのさまざまな組み合わせでテーブルの多数のテスト コピーを作成し、さまざまなクエリを使用して一連のパフォーマンス分析を実行した結果、この質問に対する単純な答えは 1 つではないと思います。状況はそれぞれ異なり、この質問の範囲はこのフォーラムには広すぎます。フィードバックをお寄せいただきありがとうございます。すべて役に立ちました。

于 2012-06-29T16:43:58.827 に答える