【发布时间】:2018-11-07 08:53:33
【问题描述】:
我在 oracle 中处理多达 10 亿条记录,我真的需要效率。
第一个表是notification。我需要获取以下数据。
src_data_id | match_data_id
第二个表是person_info。 id 与notification 表中的 src_data_id 和 match_data_id 相同。
id | name
第三张表是sample_info,其中self_object_id是person_info的外键。
id | self_object_id
第四个表是sample_dna_gene,其中sample_id 与sample_id 中的id 相同。
sample_id | gene_info
我正在用 Java 编写一个程序,我想封装一个对象列表。每个对象都包含名称(来自 person_info)和gene_info(来自gene_info)。
最初,我分两步完成。我加入了 notification 和 person_info 来获取 ID。然后我加入了person_info、sample_info和gene_info来获取名字和它们对应的gene_info。
这对于较小的数据库来说很好,但处理多达十亿条记录时,我需要担心速度。我不应该像以前那样加入三个表,而是对每个表使用简单的 sql,然后用 Java 加入各个部分。
使用单独的 sql 从 person_info 获取 id 很容易,但我在获取它们对应的 gene_info 时遇到了麻烦。我可以通过使用 in(id1,id2,id3...) 的简单 sql 获取 sample_info.id。然后我可以使用 in(id1,id2,id3...) 用另一个简单的 sql 找到gene_info。
我可以在 java 中获取所有这些列表,但是如何将它们放在一起?我正在使用spring和mybatis。本来我可以做一个大杂乱的 sql 并将所有元素封装在 mapper 中。我不知道现在该怎么办。
编辑:我现在的凌乱sql是
select to_char(sdg.gene_info), max(aa.pid), max(aa.sid), max(aa.id_card_no)
from (select max(pi.person_name),
max(pi.id) pid,
si.id sid,
max(pi.id_card_no),
max(pi.race)
from person_info pi
join sample_info si
on pi.id = si.self_object_id
group by si.id) aa
join sample_dna_gene sdg
on sdg.sample_id = aa.sid
group by to_char(sdg.gene_info)
where aa.pid in ('...')
这比原来的问题要复杂一些。我需要先在sample_id 中按id 分组,然后在sample_data_gene 中按gene_info 分组。我不得不使用大量的 max() 所以 group by 才能工作,即使那样,我仍然无法让gene_info group by 正常工作。我不确定 max() 的效率有多低以及它会减慢查询的速度,但是您可以清楚地看到为什么我现在想避免如此混乱的 sql。
【问题讨论】:
-
如果有什么需要澄清的,请尽管问。
-
我认为更简单的问题是......如何将多个表中的数据拉到一起而不用 sql 将它们连接起来,而是用 java 将它们包装在一起。
-
为什么你认为在关系数据库中连接数据(当然,这就是高效连接表!)会比在 Java 中单独连接数据要慢?您将通过这种方式获取更多数据,以及存储数据以进行处理等工作。我假设您的表已经收集了针对它们的最新统计信息(如果您的数据有偏差,则包括直方图)加上任何必要的索引。如果您可以编辑您的问题以添加您当前的连接查询,这将有所帮助。
-
如果你有一个十亿行的数据库,它是由在处理十亿行表方面经验丰富的人建模和实现的,那么 SQL 连接将是检索数据的最有效方式。所以,我们不得不问你,你是否真的编写了一个连接所有四个表的查询,并且你得到了次优的响应时间?或者这只是过早的优化?
-
感谢您的反馈。我现在已经在我的问题中包含了 sql。我正在使用一个只有几百条记录的小得多的数据库来执行此操作,所以我没有实际测试速度,但我只是假设这个 sql 会导致实际庞大的数据库出现问题。
标签: java sql spring oracle spring-mvc