2013-03-19 2 views
0

내 쿼리가로드 속도가 느려지는 이유에 대한 완벽한 설명이 있습니까?내 쿼리로드가 일반적인 쿼리보다 느린 이유

내 쿼리를 빠르게로드 할 수있는 재구성이 있습니까? 여기에 전체에서

SELECT IF(IMI.BRANCH_CODE IS NOT NULL AND IMI.PRODCODE IS NOT NULL AND IMI.POLNO IS NOT NULL,"Y","N") as STATUS, 
         NOW(),ICH.CLAIM_NO,ICH.BRANCH_CODE, 
         ICH.PRODUCT_TYPE,ICH.POLICY_NO,ICH.ASSURED_NAME, 
         ICH.AGENT_NO,ICH.INCEPTION_DT,ICH.EXPIRY_DT, 
         ICH.DT_REPORTED,IMI.BASIC_PREMIUM,ICH.CLAIM_STATUS, 
         IRPD.CLAIM_RESERVE,IRPD.TOTAL_AMT_RECOMMENDED,IRPD.DT_RECOMMENDED, 
         IMI.UW_YEAR,ICDO.PLATE_NO,ICDO.CHASSIS_NO, 
         ICDO.MOTOR_NO,IMI.LOCATION,IMI.RISKNO,IMI.SEQNO 
        FROM `ICATS_CLAIM_HEADER` ICH 
        LEFT JOIN `ICATS_CLAIM_DETAILS_OD` ICDO ON ICH.CLAIM_NO = ICDO.CLAIM_NO 
        LEFT JOIN `ICATS_MULTIPLE_LOSS` IML ON ICH.CLAIM_NO = IML.CLAIM_NO 
        LEFT JOIN (SELECT * FROM ICATS_RESERVE_PAYMENT_DETAILS 
           WHERE DATEDIFF(NOW(),DT_RECOMMENDED)=1 OR DATEDIFF(NOW(),RESERVE_DT)=1) IRPD 
           ON ICH.CLAIM_NO = IRPD.CLAIM_NO 
        LEFT JOIN (SELECT POLNO,PRODCODE,BRANCH_CODE,MAX(SEQNO)as SEQNO FROM IWRITE_MOTOR_INFO 
           GROUP BY POLNO,PRODCODE,BRANCH_CODE) IM 
           ON ICH.POLICY_NO = IM.POLNO AND ICH.BRANCH_CODE = IM.BRANCH_CODE AND ICH.PRODUCT_TYPE = IM.PRODCODE 
           JOIN IWRITE_MOTOR_INFO IMI 
           ON IM.POLNO = IMI.POLNO AND IM.PRODCODE = IMI.PRODCODE AND IM.BRANCH_CODE = IMI.BRANCH_CODE AND IM.SEQNO = IMI.SEQNO 
        WHERE (DATEDIFF(CURDATE(),ICH.CLAIM_STATUS_DT)=1 
          OR DATEDIFF(NOW(),ICDO.TRANSACTION_DT)=1 
          OR DATEDIFF(NOW(),IRPD.RESERVE_DT)=1 
          OR DATEDIFF(NOW(),IRPD.DT_RECOMMENDED)=1) 
       ORDER BY ICH.CLAIM_NO,IRPD.SEQUENCE_NO ASC 

모든 datas를 확인하면서 내 쿼리를 삽입 할 사실 100secs에 느린로드 것으로 보인다 내 전체 query.Just입니다.

INSERT INTO `ICATS_IINSURE_CLAIM_HEADER`(IINSURE_EXIST,RECORD_CREATED_DT,CLAIM_NUMBER,BRANCH_CODE,PRODCODE,POLNO,ASSURED_NAME1, 
       AGENT_CODE,INCEPTION,EXPIRY,DATE_REPORTED,BASIC_PREMIUM, 
       CLAIM_STATUS,RESERVE_AMOUNT,CLAIMS_PAID_AMOUNT, 
       DATE_RECOMMEND_PAYMENT,UW_YEAR,PLATE_NUMBER, 
       CHASSIS,ENGINE,LOCATION,RISKNO,SEQ) 
      SELECT IF(IMI.BRANCH_CODE IS NOT NULL AND IMI.PRODCODE IS NOT NULL AND IMI.POLNO IS NOT NULL,"Y","N") as STATUS, 
       NOW(),ICH.CLAIM_NO,ICH.BRANCH_CODE, 
       ICH.PRODUCT_TYPE,ICH.POLICY_NO,ICH.ASSURED_NAME, 
       ICH.AGENT_NO,ICH.INCEPTION_DT,ICH.EXPIRY_DT, 
       ICH.DT_REPORTED,IMI.BASIC_PREMIUM,ICH.CLAIM_STATUS, 
       IRPD.CLAIM_RESERVE,IRPD.TOTAL_AMT_RECOMMENDED,IRPD.DT_RECOMMENDED, 
       IMI.UW_YEAR,ICDO.PLATE_NO,ICDO.CHASSIS_NO, 
       ICDO.MOTOR_NO,IMI.LOCATION,IMI.RISKNO,IMI.SEQNO 
      FROM `ICATS_CLAIM_HEADER` ICH 
      LEFT JOIN `ICATS_CLAIM_DETAILS_OD` ICDO ON ICH.CLAIM_NO = ICDO.CLAIM_NO 
      LEFT JOIN `ICATS_MULTIPLE_LOSS` IML ON ICH.CLAIM_NO = IML.CLAIM_NO 
      LEFT JOIN (SELECT * FROM ICATS_RESERVE_PAYMENT_DETAILS 
         WHERE DATEDIFF(NOW(),DT_RECOMMENDED)=1 OR DATEDIFF(NOW(),RESERVE_DT)=1) IRPD 
         ON ICH.CLAIM_NO = IRPD.CLAIM_NO 
      LEFT JOIN (SELECT POLNO,PRODCODE,BRANCH_CODE,MAX(SEQNO)as SEQNO FROM IWRITE_MOTOR_INFO 
         GROUP BY POLNO,PRODCODE,BRANCH_CODE) IM 
         ON ICH.POLICY_NO = IM.POLNO AND ICH.BRANCH_CODE = IM.BRANCH_CODE AND ICH.PRODUCT_TYPE = IM.PRODCODE 
         JOIN IWRITE_MOTOR_INFO IMI 
         ON IM.POLNO = IMI.POLNO AND IM.PRODCODE = IMI.PRODCODE AND IM.BRANCH_CODE = IMI.BRANCH_CODE AND IM.SEQNO = IMI.SEQNO 
      WHERE (DATEDIFF(CURDATE(),ICH.CLAIM_STATUS_DT)=1 
        OR DATEDIFF(NOW(),ICDO.TRANSACTION_DT)=1 
        OR DATEDIFF(NOW(),IRPD.RESERVE_DT)=1 
        OR DATEDIFF(NOW(),IRPD.DT_RECOMMENDED)=1) 
     ORDER BY ICH.CLAIM_NO,IRPD.SEQUENCE_NO ASC 
+3

내부 선택을 사용하지 마십시오. (왼쪽 조인에서 볼 수 있습니다) – SNpn

+3

OR이 나쁜 성능으로 악명 높습니다. –

+0

@SNpn, 실제 테이블 대신 하위 쿼리에서 선택하여 성능이 향상되는 것을 보았습니다. –

답변

3

가장 중요한 이유 중 하나는 where 절이 기능 만 갖고 있다는 것입니다. 이 문제를 해결하려면 다음과 같이 변수를 소개하는 방법을 찾으십시오.

WHERE (DATEDIFF(CURDATE(),ICH.CLAIM_STATUS_DT)=1 
OR DATEDIFF(NOW(),ICDO.TRANSACTION_DT)=1 
OR DATEDIFF(NOW(),IRPD.RESERVE_DT)=1 
OR DATEDIFF(NOW(),IRPD.DT_RECOMMENDED)=1) 

where ich.claim_status_dt >= a variable 
and ich.claim_status_dt < another variable 
etc 

당신이 저장 프로 시저를 만들고이 변수를 설정하거나,이 쿼리는 응용 프로그램 코드에서 변수를 설정하는 PHP/.NET/ColdFusion에서/어떤 응용 프로그램의 일부인 경우 변환 할 수 있습니다 그들을 매개 변수로.

관련 문제