请问各位大侠 下面的SQL在有大量数据的数据库里面会跑2个小时然后挂掉,请问该如何 优化呢?偶不太会SQL,请大侠们帮帮偶谢谢啦!
注:下面代码中 0=0,5=5,1=1 这里要替换成 A.END_DT IS NULL OR A.END_DT >to_date('" & Sdate & "', 'dd-mm-yyyy')
              3=3,4=4,6=6,7=7 这里要替换成 END_DT IS NULL OR END_DT >to_date('" & Sdate & "', 'dd-mm-yyyy')
             2=2 这里要替换成A.CUST_REQ_DT <= to_date('" & crd & "', 'dd-mm-yyyy')
   这里的Sdate是一个开始时间,crd 也是一个时间。
             SELECT /*+driving_site(A)*/ DISTINCT D.NM AS CUSTOMER_NAME,
A.WORK_ORD_NO, 
NVL(J.EXT_ID,
(SELECT /*PARA_VAL*/* FROM OR_OP_NW_ORD_PARA Newsvcno,OR_OP_ADDR_LOCALITY EOR_OP_ADDR_LOCALITY E WHERE E.NW_TXN_ID=Newsvcno.NW_TXN_ID and PARA_NM in ('SvcNo', 'N1No')) )
SERVICE_NO,
A.WORK_ORD_CREATE_DT AS ORDER_TAKEN_DATE,
A.CUST_REQ_DT AS CRD, 
B1.DECODE AS ORDER_PRIORITY,
B.SVC_TY,
B2.DECODE AS ORDER_TY,
F.GRP_ID,
F.PERFORMER_ID,
F.CONTROLLER_ID, 
G.PROJECT_ID AS PROJECT_CODE, 
F.STATUS_CD AS ACTIVITY_STATUS,
F.REQ_BY_DT,
DECODE(A.TIME_IND,1, TO_CHAR(A.CUST_REQ_DT, 'hh:mi:ss PM'), '') CUST_REQ_TM,
I.ACT_NM, 
NVL((SELECT DECODE(PARA_VAL, NULL, PARA_VAL, PARA_VAL/1000 || 'Kbps') FROM OR_OP_NW_ORD_PARA Newspeed WHERE Newspeed.PARA_NM='Speed' AND E.NW_TXN_ID = NEWSPEED.NW_TXN_ID
),(SELECT DECODE(PARA_VAL, NULL, PARA_VAL, PARA_VAL/1000 || 'Kbps') FROM OR_OP_NW_PRDT_PARA Existspeed WHERE Existspeed.PARA_NM='Speed' AND E.NW_INST_ID = EXISTSPEED.NW_INST_ID) ) SPEED,
E.PRDT_LONG_DESC AS PRODUCT_DESCRIPTION,
CASE WHEN A.WORK_ORD_TY='3' THEN AJ.EXCH_CD
WHEN A.WORK_ORD_TY ='2' AND NW_PRODUCT_ACTION='3' THEN AJ.EXCH_CD 
END A_END_EXCH_CD,
CASE WHEN A.WORK_ORD_TY='1' THEN NEWAJ.EXCH_CD
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='1' THEN NEWAJ.EXCH_CD
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='2' THEN NEWAJ.EXCH_CD
END NEW_A_END_EXCH_CD,
CASE WHEN A.WORK_ORD_TY='3' THEN BJ.EXCH_CD
WHEN A.WORK_ORD_TY ='2' AND NW_PRODUCT_ACTION='3' THEN BJ.EXCH_CD 
END B_END_EXCH_CD,
CASE WHEN A.WORK_ORD_TY='1' THEN NEWBJ.EXCH_CD
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='1' THEN NEWBJ.EXCH_CD
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='2' THEN NEWBJ.EXCH_CD
END NEW_B_END_EXCH_CD,
CASE WHEN A.WORK_ORD_TY='3' THEN AJ.ADDRESS
WHEN A.WORK_ORD_TY ='2' AND NW_PRODUCT_ACTION='3' THEN AJ.ADDRESS 
END A_END_ADDRESS,
CASE WHEN A.WORK_ORD_TY='1' THEN NEWAJ.ADDRESS
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='1' THEN NEWAJ.ADDRESS
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='2' THEN NEWAJ.ADDRESS
END NEW_A_END_ADDRESS,
CASE WHEN A.WORK_ORD_TY='3' THEN BJ.ADDRESS
WHEN A.WORK_ORD_TY ='2' AND NW_PRODUCT_ACTION='3' THEN BJ.ADDRESS 
END B_END_ADDRESS,
CASE WHEN A.WORK_ORD_TY='1' THEN NEWBJ.ADDRESS
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='1' THEN NEWBJ.ADDRESS
WHEN A.WORK_ORD_TY='2' AND E.NW_PRODUCT_ACTION='2' THEN NEWBJ.ADDRESS
END NEW_B_END_ADDRESS,
/*****change code s****************/
TRUNC(TA.LAST_UPDATE_DT) AS "LAST_UPDATE_DT" ,
F.COMPLETED_DT,
CASE WHEN TRUNC(SYSDATE)-TRUNC(TA.LAST_UPDATE_DT)<3 THEN
'Y'
ELSE
''
END 
"ORDER<3",
CASE WHEN TRUNC(SYSDATE)-TRUNC(TA.LAST_UPDATE_DT)>3 THEN
'Y'
ELSE
''
END 
"ORDER>3"
/*****change code e****************/
FROM 
OR_TA_AUDIT TA,
OR_OP_WORK_ORD A,
OR_OP_SVC_INST B,
OR_OP_ACCT C, 
OR_OP_NM D,
(select WORK_ORD_NO, PRDT_LONG_DESC, NW_PRODUCT_ACTION, NW_TXN_ID, NW_INST_ID from OR_OP_NW_ORD_TXN k, OR_OP_NW_PRDT_CD L where line_no='1' and nw_txn_status <> '3'
AND k.NW_PRDT_CD = L.NW_PRDT_CD
AND L.LEVEL_IND = '1') E,
OR_OM_ACT_INST F,
OR_OP_PROJECT_MAP G,
OR_OM_ACT_MASTER I,
(select svc_inst_id, ext_id from OR_OP_EXT_SI_ID_MAP where 6=6) J,
OR_TA_MASTER_CD B1,
OR_TA_MASTER_CD B2,
(SELECT /*+USE_HASH(A,B,C,D,E)*/ SVC_INST_ID, EXCH_CD, GATEWAY_CD, C.PREMISE_NO || ' ' || D.D_STREET_NM || ' ' || B.D_UNIT_NO || ' ' || ' ' || C.D_BUILDING_NM 
|| ' ' || E.COUNTRY || ' ' || C.POSTAL_CD AS ADDRESS
FROM OR_OP_SVC_INST_ADDR_MAP A,
OR_OP_ADDR_SUB_PREMISE B,
OR_OP_ADDR_PREMISE C,
OR_OP_ADDR_STREET D,
OR_OP_ADDR_LOCALITY E
WHERE A.SI_WO_ADDR_TY='1' 
AND 0=0
AND  A.SUB_PREMISE_ID = B.SUB_PREMISE_ID
AND B.ADDR_STATUS ='1'
AND B.PREMISE_ID = C.PREMISE_ID(+)
AND C.STREET_ID = D.STREET_ID(+)
AND D.LOCALITY_ID = E.LOCALITY_ID(+)) AJ,
(SELECT /*+USE_HASH(A,B,C,D,E)*/SVC_INST_ID, EXCH_CD, GATEWAY_CD, C.PREMISE_NO || ' ' || D.D_STREET_NM || ' ' || B.D_UNIT_NO || ' ' || ' ' || C.D_BUILDING_NM 
|| ' ' || E.COUNTRY || ' ' || C.POSTAL_CD AS ADDRESS
FROM OR_OP_SVC_INST_ADDR_MAP A,
OR_OP_ADDR_SUB_PREMISE B,
OR_OP_ADDR_PREMISE C,
OR_OP_ADDR_STREET D,
OR_OP_ADDR_LOCALITY E
WHERE A.SI_WO_ADDR_TY='2' 
AND 1=1
AND  A.SUB_PREMISE_ID = B.SUB_PREMISE_ID
AND B.ADDR_STATUS ='1'
AND B.PREMISE_ID = C.PREMISE_ID(+)
AND C.STREET_ID = D.STREET_ID(+)
AND D.LOCALITY_ID = E.LOCALITY_ID(+)) BJ,
(SELECT /*+USE_HASH(A,B,C,D,E)*/ WORK_ORD_NO, EXCH_CD, GATEWAY_CD, C.PREMISE_NO || ' ' || D.D_STREET_NM || ' ' || B.D_UNIT_NO || ' ' || ' ' || C.D_BUILDING_NM 
|| ' ' || E.COUNTRY || ' ' || C.POSTAL_CD AS ADDRESS
FROM OR_OP_WORK_ORD_ADDR_MAP A,
OR_OP_ADDR_SUB_PREMISE B,
OR_OP_ADDR_PREMISE C,
OR_OP_ADDR_STREET D,
OR_OP_ADDR_LOCALITY E
WHERE A.SI_WO_ADDR_TY='1' 
AND 0=0
AND  A.SUB_PREMISE_ID = B.SUB_PREMISE_ID
AND B.ADDR_STATUS ='1'
AND B.PREMISE_ID = C.PREMISE_ID(+)
AND C.STREET_ID = D.STREET_ID(+)
AND D.LOCALITY_ID = E.LOCALITY_ID(+)) NEWAJ,
(SELECT /*+USE_HASH(A,B,C,D,E)*/WORK_ORD_NO, EXCH_CD, GATEWAY_CD, C.PREMISE_NO || ' ' || D.D_STREET_NM || ' ' || B.D_UNIT_NO || ' ' || ' ' || C.D_BUILDING_NM 
|| ' ' || E.COUNTRY || ' ' || C.POSTAL_CD AS ADDRESS
FROM OR_OP_WORK_ORD_ADDR_MAP A,
OR_OP_ADDR_SUB_PREMISE B,
OR_OP_ADDR_PREMISE C,
OR_OP_ADDR_STREET D,
OR_OP_ADDR_LOCALITY E
WHERE A.SI_WO_ADDR_TY='2' 
AND 1=1
AND  A.SUB_PREMISE_ID = B.SUB_PREMISE_ID
AND B.ADDR_STATUS ='1'
AND B.PREMISE_ID = C.PREMISE_ID(+)
AND C.STREET_ID = D.STREET_ID(+)
AND D.LOCALITY_ID = E.LOCALITY_ID(+)) NEWBJ
WHERE
/*****change code s****************/
TA.WORK_ORD_NO=F.WORK_ORD_NO
AND
TA.AUDIT_TY='OM_ACT_INST'
AND
TA.NEW_VAL='RDY'
AND
/*****change code e****************/ 
F.GRP_ID = 'TNP' 
AND 
F.STATUS_CD IN ('RDY','NRD')
/*work_ord*/
AND A.SVC_INST_ID = B.SVC_INST_ID
AND 2=2
AND B.ACCT_ID = C.ACCT_ID 
/*customer name*/
AND C.MASTER_ACCT_ID = D.ACCT_ID 
AND D.NM_TY ='1'
AND D.CURRENT_IND = 'Y'
/*ntwk prdt*/
AND A.WORK_ORD_NO = E.WORK_ORD_NO (+)
AND A.WORK_ORD_NO = F.WORK_ORD_NO
/*decod*/
AND A.ORD_PRIORITY = B1.CD
AND B1.KEY_TY ='ORD_PRIORITY'
AND A.WORK_ORD_TY = B2.CD
AND B2.KEY_TY='WORK_ORD_TY'
/*activity desc*/
AND F.ACT_ID = I.ACT_ID
AND F.ORD_TY = I.ORD_TY
AND F.SVC_TY = I.SVC_TY
/*project*/
AND A.WORK_ORD_NO =G.WORK_ORD_NO (+)
/*A end installation*/
AND B.SVC_INST_ID = AJ.SVC_INST_ID (+)
/*B end installation*/
AND B.SVC_INST_ID = BJ.SVC_INST_ID (+)
/*A end installation*/
AND A.WORK_ORD_NO = NEWAJ.WORK_ORD_NO (+)
/*B end installation*/
AND A.WORK_ORD_NO = NEWBJ.WORK_ORD_NO (+)
AND A.SVC_INST_ID = J.SVC_INST_ID (+)

解决方案 »

  1.   

    你把执行了4遍的
    AJ,BJ,NEWAJ,NEWBJ合成1个
    把关联条件放最外!
      

  2.   

    (SELECT /*PARA_VAL*/* 
    FROM OR_OP_NW_ORD_PARA Newsvcno,
         OR_OP_ADDR_LOCALITY EOR_OP_ADDR_LOCALITY E
    WHERE E.NW_TXN_ID=Newsvcno.NW_TXN_ID and PARA_NM in ('SvcNo', 'N1No')) )SERVICE_NO,
    没感觉做什么,在你的sql
      

  3.   

    2楼 大侠太谢谢了。。
    可是。。偶是新手。。
    这个。。那个偶暂时还米有分可以给你哦~~~~(>_<)~~~~ (别打偶啊。。)