【问题标题】:what is the most efficient way to get multiple columns from multiple tables in oracle?从oracle中的多个表中获取多个列的最有效方法是什么?
【发布时间】: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


【解决方案1】:

我有类似的情况。它有 4 个单独的阅读器,每个表一个,合并是在 java 端完成的。不幸的是,先决条件是在数据库方面对收入流进行分类。 您从流 1 中读取单个记录,然后从流 2 中读取记录,直到键更改(因为您按该键排序并且键对于所有选项卡都是通用的),然后对于后续流相同。在我的情况下,这是有道理的,因为第一个表非常宽,接下来的 3 个表中有很多行用于表 1 中的单个键。如果在您的情况下没有 1:n(其中 n 很大)关系,我不明白为什么这种方法可以比加入更好。

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2011-10-08
    • 1970-01-01
    • 2018-04-25
    • 2011-11-28
    • 1970-01-01
    • 2020-04-22
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多