我在oracle中处理多达十亿条记录,我真的需要效率。
第一个表是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)。
最初,我分2个步骤进行操作。我加入了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并将所有元素封装在映射器中。我不确定现在该怎么办。
编辑:我现在遇到的凌乱的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。
答案 0 :(得分:0)
我有类似的情况。它分散了4个单独的读取器,每个表一个,并且合并是在Java端完成的。不幸的是,这样做的先决条件是在数据库端对收入流进行排序。 您从流1中读取单个记录,然后从流2中读取记录,直到键更改(按该键排序,并且键在所有选项卡中通用),然后对于后续流相同。在我的情况下,第一个表非常宽,接下来的3个表1中的单个键有很多行,这很有意义。如果在您的情况下,没有1:n(其中n大)的关系,我不明白为什么这样的方法比加入更好。