我有一个 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
对此表的查询可以使用、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
语句通常会过滤多个列上的数据,但绝不会仅从基本数据表中过滤。
如何设计表以在选择所有列时获得最佳查询性能?
我是只使用索引、只使用分区还是两者的组合?磁盘空间和插入/更新性能不是问题。