使用表的连接进行查询需要很长时间才能执行

时间:2014-09-04 18:42:05

标签: sql oracle

我正在使用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%数据的统计信息。我可以采取其他任何方式加快速度吗?

2 个答案:

答案 0 :(得分:0)

根据我的个人经验,我发现让SQL引擎试图弄清楚连接是非常耗时的。我总是指定连接的类型(INNER,LEFT,RIGHT等......)和连接所在的字段。

我看到你检查索引是好的。我假设它们位于您用作连接键的字段上。

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

答案 1 :(得分:0)

以下是使用正确的完整连接语法编写的查询:

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上的索引可能有所帮助。但是,我怀疑树的根节点确实正在扩展正在处理的数据量。