【问题标题】:Query with Join of tables is taking long time to execute带有表连接的查询需要很长时间才能执行
【发布时间】:2014-09-04 18:42:05
【问题描述】:

我正在使用 Oracle 11g。我有一个查询需要很长时间才能执行 150,000 条记录。

查询是:

 insert /*+ APPEND NOLOGGING */ into CONCEPT_COUNTS_DIMENSION
 (select fa.c_fullname AS CONCEPT_PATH ,ltrim(SUBSTR(fa.c_fullname, 1,instr(fa.c_fullname, '\',-1,2))) AS PARENT_CONCEPT_PATH,count(distinct tpm.encounter_num) AS value,'Document_Count' as type
 from "I2B2METADATA"."I2B2_toinsert" fa ,"I2B2METADATA"."I2B2_toinsert" la ,I2B2DEMODATA.OBSERVATION_FACT_to_insert tpm ,i2b2demodata.PATIENT_DIMENSION p where 
 fa.c_fullname like '\a\b\c\%' and
 la.c_fullname like fa.c_fullname || '%' escape '`'
/*  and la.c_visualattributes like 'L%' */
 and tpm.patient_num = p.patient_num
 and la.c_basecode = tpm.concept_cd
 group by fa.c_fullname ,ltrim(SUBSTR(fa.c_fullname, 1,instr(fa.c_fullname, '\',-1,2))));

此查询将一个表与其自身和 2 个其他表连接起来,并为其下方的路径选择不同数量的患者。

任何人都可以建议如何调整此查询以使其更快。我验证了这些表的索引并为 1% 的数据生成了统计信息。有什么其他方法可以加快速度吗?

【问题讨论】:

标签: sql oracle


【解决方案1】:

根据我的个人经验,我发现让 SQL 引擎尝试找出连接非常耗时。我总是指定连接的类型(INNER、LEFT、RIGHT 等...)以及连接所在的字段。

我看到您确实检查了索引,这很好。我假设它们位于您用作连接键的字段中。

我要看的另一件事是 GROUP BY 子句。如果您将这些内容读入表中,就像您正在尝试做的那样,这会给查询带来一些开销,因为它必须对字段执行计算,然后将它们放入所需的组织中。我会尝试从插入中删除它,然后当您从表中读取数据时,然后执行 Group By。

【讨论】:

  • 旧样式和新样式 (SQL-92) 连接之间没有性能差异。查询计划相同。
【解决方案2】:

这是使用正确的完全连接语法编写的查询:

insert /*+ APPEND NOLOGGING */ into CONCEPT_COUNTS_DIMENSION
    select fa.c_fullname AS CONCEPT_PATH ,
           ltrim(SUBSTR(fa.c_fullname, 1,instr(fa.c_fullname, '\',-1,2))) AS PARENT_CONCEPT_PATH,
           count(distinct tpm.encounter_num) AS value,
           'Document_Count' as type
    from "I2B2METADATA"."I2B2_toinsert" fa join
         "I2B2METADATA"."I2B2_toinsert" la
         on la.c_fullname like fa.c_fullname || '%' escape '`' join
         I2B2DEMODATA.OBSERVATION_FACT_to_insert tpm 
         on la.c_basecode = tpm.concept_cd join
         i2b2demodata.PATIENT_DIMENSION p 
         on tpm.patient_num = p.patient_num 
    where fa.c_fullname like '\a\b\c\%' and
          /*  and la.c_visualattributes like 'L%' */
     group by fa.c_fullname, ltrim(SUBSTR(fa.c_fullname, 1,instr(fa.c_fullname, '\',-1,2))));

fala 之间的连接可能需要很长时间。我假设其他维度已正确编入索引。 c_fullname 上的索引可能会有所帮助。但是,我怀疑树的根节点确实在扩展正在处理的数据量。

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 2016-04-22
    • 2021-12-25
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多