SELECT D.CSGMT_SEQ_NO || D.NRN || D.RESP_CD AS PK, 'Outstanding Declaration Notice' AS DESCP, 
D.MOD_TRANSPORT_MODE AS TRANSPORT_MODE, 'Z' AS SHIPMENT_TY, 
NVL(R.ASGMT_STATUS, '-') AS ASGMT_STATUS, TRUNC(MOD_SHIPMENT_DT, 'MONTH') AS SHIPMENT_DT
FROM TE_CED_UNSELCASERLT R, TE_CSD_DCN D
WHERE R.CSGMT_SEQ_NO (+) = D.CSGMT_SEQ_NO
AND R.NRN (+) = D.NRN
AND D.RESP_CD IS NULL 
TE_CED_UNSELCASERLT的索引为CSGMT_SEQ_NO和NRN,TE_CSD_DCN的索引为CSGMT_SEQ_NO和NRN和RESP_CD。
现在运行是两个表都是full table scan

解决方案 »

  1.   


    --可对TE_CED_UNSELCASERLT表中的CSGMT_SEQ_NO和NRN分别建立索引,对TE_CSD_DCN表亦如此。SELECT D.CSGMT_SEQ_NO || D.NRN || D.RESP_CD AS PK,
           'Outstanding Declaration Notice' AS DESCP,
           D.MOD_TRANSPORT_MODE AS TRANSPORT_MODE,
           'Z' AS SHIPMENT_TY,
           NVL(R.ASGMT_STATUS, '-') AS ASGMT_STATUS,
           TRUNC(MOD_SHIPMENT_DT, 'MONTH') AS SHIPMENT_DT
      FROM TE_CED_UNSELCASERLT R, TE_CSD_DCN D
     WHERE R.CSGMT_SEQ_NO(+) = D.CSGMT_SEQ_NO
       AND R.NRN(+) = D.NRN
       AND D.RESP_CD IS NULL;
      

  2.   

    相关字段建了索引没?用hint索引的方式试试看。
      

  3.   

    把所有的TE_CED_UNSELCASERLT和TE_CSD_DCN的主健,聚合Index,非聚合Index告诉我。如果两个表字段总长度不是很大的话,
    TE_CED_UNSELCASERLT的索引CSGMT_SEQ_NO,NRN 改成聚合Index;
    TE_CSD_DCN的索引CSGMT_SEQ_NO,NRN,RESP_CD 改成聚合Index;
      

  4.   

    觉得TE_CED_UNSELCASERLT的全表扫描应该可以去掉如果逻辑没错的话, 试试这个:SELECT D.CSGMT_SEQ_NO || D.NRN || D.RESP_CD AS PK, 'Outstanding Declaration Notice' AS DESCP,
    D.MOD_TRANSPORT_MODE AS TRANSPORT_MODE, 'Z' AS SHIPMENT_TY,
    NVL(R.ASGMT_STATUS, '-') AS ASGMT_STATUS, TRUNC(MOD_SHIPMENT_DT, 'MONTH') AS SHIPMENT_DT
    FROM TE_CED_UNSELCASERLT R, TE_CSD_DCN D
    WHERE R.CSGMT_SEQ_NO (+) = D.CSGMT_SEQ_NO
    AND R.NRN (+) = D.NRN
    AND D.RESP_CD IS NULL 
    AND R.CSGMT_SEQ_NO IS NOT NULL
    AND R.CSGMT_SEQ_NO IS NOT NULL
      

  5.   

    SELECT D.CSGMT_SEQ_NO || D.NRN || D.RESP_CD AS PK,
           'Outstanding Declaration Notice' AS DESCP,
           D.MOD_TRANSPORT_MODE AS TRANSPORT_MODE,
           'Z' AS SHIPMENT_TY,
           NVL(R.ASGMT_STATUS, '-') AS ASGMT_STATUS,
           TRUNC(MOD_SHIPMENT_DT, 'MONTH') AS SHIPMENT_DT
      FROM TE_CED_UNSELCASERLT R, TE_CSD_DCN D
     WHERE 
       D.RESP_CD IS NULL   
       AND R.CSGMT_SEQ_NO(+) = D.CSGMT_SEQ_NO
       AND R.NRN(+) = D.NRN 这样就能够最省了
       
      

  6.   

    RESP_CD这列估计没有建索引
      

  7.   

    当然is null是会full scan的,弄成>0试试
    ps:
    你用大写我很头痛,现在流行全部小写格式,便于理解,你这样在我脑子里面会运行一次lower()
      

  8.   

    楼主,执行计划和cost都帖出来