我正在使用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%数据的统计信息。我可以采取其他任何方式加快速度吗?
答案 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))));
fa
和la
之间的联接可能需要很长时间。我假设其他维度已正确编入索引。 c_fullname
上的索引可能有所帮助。但是,我怀疑树的根节点确实正在扩展正在处理的数据量。