1

我有一个 Oracle 10g 基因组数据数据库,其中包含数个超过 1 亿行的表,这些表类似于以下内容:

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值,大约有 50k 行。
  • 每一个AssayID都只发生一次Sample
  • Mutation是相对随机的,Call可以是三个值之一。
  • AssayID对此表的查询可以使用、SampleMutationCall或通过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语句通常会过滤多个列上的数据,但绝不会仅从基本数据表中过滤。

如何设计表以在选择所有列时获得最佳查询性能?
我是只使用索引、只使用分区还是两者的组合?磁盘空间和插入/更新性能不是问题。

4

2 回答 2

1

作为第一步,您可以运行 Oracle 的SQL Access Advisor并查看它提供的建议。

于 2012-06-27T12:54:26.350 回答
0

在创建了具有不同索引和分区组合的表的大量测试副本,并使用广泛的查询选择运行一系列性能分析之后,我认为这个问题没有一个单一、简单的答案。每种情况都不同,这个问题的范围对于这个论坛来说太宽泛了。谢谢大家的反馈,这都很有帮助。

于 2012-06-29T16:43:58.827 回答