Oracle11g 优化查询-我在这里做了一些非常错误的事情。选择?
因此,基本上这个查询所做的是求和一些值,并从另一个包含180万条记录的表(EDTF007)中获取一些数据。EDTF011主表有大约800k条记录 那有什么问题 嗯。。。我从EDTF007获取的字段在CASE子句中有一些规则。我通过创建不同的内部联接来获取字段CCONTA,如本例所示 数据库需要1小时才能运行此查询。我运行了统计数据,创建了索引,重建了索引,尝试了直接访问分区。运行此查询大约需要1小时。目前还不能接受 问题是。。。我没有主意了。。。问题是查询的结构,因为。。。我得到的等待事件。。。都与此错误的查询结构相关…: 你知道我怎样才能扭转局面吗?表上的更新也太慢了,我想Oracle11g 优化查询-我在这里做了一些非常错误的事情。选择?,oracle11g,query-performance,Oracle11g,Query Performance,因此,基本上这个查询所做的是求和一些值,并从另一个包含180万条记录的表(EDTF007)中获取一些数据。EDTF011主表有大约800k条记录 那有什么问题 嗯。。。我从EDTF007获取的字段在CASE子句中有一些规则。我通过创建不同的内部联接来获取字段CCONTA,如本例所示 数据库需要1小时才能运行此查询。我运行了统计数据,创建了索引,重建了索引,尝试了直接访问分区。运行此查询大约需要1小时。目前还不能接受 问题是。。。我没有主意了。。。问题是查询的结构,因为。。。我得到的等待事件。。。
WITH IMP AS (SELECT CCONTA, CREFERENCIA FROM EDTF007_IMPARIDADE PARTITION (P_IMPARIDADE_201703))
SELECT SUM(GC.MAVALIAA),
V.ID, NVL(GC.CKNUMCTA, '00000000000'), NVL(GC.CKBALCAO, '0000'), GC.CKPRODUT, GC.CKSUBPRO, GC.ZDEPOSIT, GC.MSLDACT, SUM(GC.MAVALIAA), GC.TIPGARBL, GC.CGARANT, NVL(G.TIPO_GAR, 'SEM GAR'), G.TIPO_GAR2, GC.CREFERENCIA_IMP,
CASE
WHEN (SUBSTR(GC.CKPRODUT, 1, 3) ) IN ('096' , '097' , '020' , '021' , '024') AND GC.CKPRODUT != 'MOR' THEN
(SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA) = CCONTA)
WHEN (SUBSTR(GC.CKPRODUT, 1, 3) ) IN ('035') AND GC.CKPRODUT != 'MOR' THEN
(SELECT DISTINCT CCONTA FROM IMP WHERE GC.ZDEPOSIT = CREFERENCIA)
WHEN NVL(GC.CKBALCAO ||GC.CKNUMCTA, '000000000000000') IN (SELECT IMP.CCONTA FROM RE_ED.EDTF007_IMPARIDADE IMP WHERE (IMP.PRODUTO ) = ( '000' ) AND (IMP.SEGMENTO ) IN ('IE' , 'IP' , 'IA' , 'GI')) AND GC.CKPRODUT != 'MOR' THEN
(SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA) = CCONTA)
WHEN SUBSTR(GC.CKPRODUT, 1, 3) NOT IN ('096' , '097' , '020' , '021' , '024' , '035' ) AND GC.CKPRODUT != 'MOR' THEN
(SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA || GC.CREFERENCIA_IMP) = CCONTA || CREFERENCIA)
WHEN GC.CKPRODUT = 'MOR' THEN
(SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA || GC.CREFERENCIA_IMP) = CCONTA || CREFERENCIA)
ELSE '000000000000000'
END CCONTA_IMP,
GC.CREATED_BY, GC.CREATED_DATE
FROM RE_ED.EDTD011_GARANTIAS_CONTRATO GC,
(SELECT MAX(IDVERSAO) AS ID FROM RE_CD.CDTD009_VERSOES WHERE (TABELA) = ('RE_CD.CDTD015_GARANTIAS_CONTRATO')) V,
(SELECT DISTINCT TIPO_GAR, TIPO_GAR2, CODIGO FROM RE_CD.CDTD011_COD_GARANTIAS WHERE FLAG_ATIVO = 1 AND DTBEGIN_VER <= TO_TIMESTAMP(TRUNC(TO_DATE('2017-03-01', 'YYYY-MM-DD'), 'MM')) AND DTEND_VER >= TO_TIMESTAMP(LAST_DAY(TO_DATE('2017-03-01', 'YYYY-MM-DD')))) G
WHERE (GC.ANO) = ('2017')
AND (GC.MES) = ('03')
AND (GC.CGARANT) = (G.CODIGO)
GROUP BY V.ID, GC.CKNUMCTA, GC.CKBALCAO, GC.CKPRODUT, GC.CKSUBPRO, GC.ZDEPOSIT, GC.MSLDACT, GC.TIPGARBL, GC.CGARANT, G.TIPO_GAR, G.TIPO_GAR2, GC.CREFERENCIA_IMP, GC.CREATED_BY, GC.CREATED_DATE;
编辑:在与一位同事交谈后,他建议分离查询范围,而不是一个查询,我应该为每个案例尝试5个插入查询。我将继续采用这种方法。让我们看看进展如何。顺便说一句,主要目标是插入Select。我很高兴您没有得到ORA-01427:单行子查询使用该case语句返回多行!如果您只希望每个select from imp返回一个cconta值,为什么不跳过distinct并将rownum=1添加到where子句中呢?您完全正确。EDTF007表有一个组合主键。如果它返回的CCONTA值超过2。。。砰。。。反正是我的错。