MS의 SQL 최적화 단계 한 경우 최적화되지

  오늘날, 고객 불만 체계를받은 카드가 두 배로 노력으로 마침내 해결, 죽은 말했다. 지금, 무엇을 해결 단계를 기록합니다 다음 참조 있도록 :

        알리에 초점을 맞춘 클라이언트 시스템이 MS의 SQL2008 데이터베이스를 사용하여, 위의 구름 때문에, N 클라이언트는 갑자기 어떤 고객을 알 수 위가 있습니다.

  첫 번째 단계는, 첫째, 작업 관리자를 열고 CPU 사용량을 볼

이 큰 MS의 SQL 서버 인 것을 보는 것은 너무 붙어 시스템의 모든 CPU 시간을 가지고 쿼리합니다.

두 번째 단계, 열린 MS의 SQL 서버 활동 모니터가 붙어있는 문 볼 수 있습니다.

공개 활동 모니터의 방법. 에 

개체 탐색기에서 서버를 마우스 오른쪽 단추로 클릭을 찾습니다. "활동 모니터"를 참조하거나 바로 가기 키 Ctrl + Alt + A를 사용 ..

 

세 번째 단계는 잘못된 문을 찾을 수 있습니다. 프로세스, 작업 상태를 열기 심사 프로세스를 실행.

그것을 실행, 문 가능성이 붙어 분석 시스템, 문 하나의 실행에 의해 하나를 선택합니다. 어느 붙어 문을 찾을 수 있습니다.

내 상황은 다음과 같은 문장이다 :

SELECT A.cCrm, A.cCode AS cOrderCode, A.dRequire, A.dSubmit, B. * , 
        C.cCode AS cProductCode, B.cProductSpec BcProductSpec, A.dConfirm, 
        A.dCheck1, C.cParamter, C.cSpec AS cProductSpec, C.cColor, A.cCreator
     FROM 를 주문 WITH (NOLOCK)
     LEFT  JOIN Orders_Product B WITH (NOLOCK) ON A.cID = B.cOrdersID
     LEFT  JOIN 제품 C WITH (NOLOCK) ON B.cProductID = C.cID
     LEFT 가입 (
                             - 生产的产品ID는 
                SELECT  DISTINCT A1.cProductID을
                     FROM dbo.Product_Item A1
                     LEFT  JOIN dbo.Orders_ProductItem A2 ON A1.cProductID = A2.cProductID
                     WHERE A1.iProduct ! =  0 
              D) ON B.cProductID = D.cProductID
     WHERE  1  =  1 
        AND B.cProductID = D.cProductID
         AND A.iCancel =의  ' 0" 
        AND (상태 =  30 
              OR (상태 =  20 
                   AND iNewCRM ! =  1 
                   AND  NOT이  존재는 ( SELECT  1 
                                        FROM Orders_ProductItem WITH (NOLOCK)
                                         상기 iCustom =  1 
                                            AND cOrdersID = A.cID) 
                 ) 
            ) 
        AND (A.iStatusPP =  0 
              OR .iStatusPP =  1 
            ) 
        AND  NOT EXISTS ( SELECT  1 
                            FROM MOrders_Product
                             LEFT가  가입 dbo.MOrders를 ON MOrders.cID = MOrders_Product.cMOrdersID
                             WHERE cOrdersProductID = B.cSubID
                                 AND dbo.MOrders.iStatus ! =  2 )
         AND B.iCancelM =  0 
        AND B.cSubID NOT  IN (
         SELECT B를 .cOrdersProductID
             로부터 DOrders
             LEFT 가입 DOrders_Sub B를 ON A.cID = B.cDOrdersID
             WHERE iStatus가 =  3 )
     ORDER  BY A.dUDate DESC ;

분석 후로 이동하지 Caton의 시스템에 안내 :

 

B.cSubID NOT  IN (
         SELECT B.cOrdersProductID을
             FROM DOrders
             LEFT는  가입 DOrders_Sub B를 ON A.cID = B.cDOrdersID
             WHERE iStatus =  3

 

 변경하지 않음에없는 시스템 정상 작동, 문제가 해결 될 때 존재한다.

변경 코드 후 :

SELECT A.cCrm, A.cCode AS cOrderCode, A.dRequire, A.dSubmit, B. * , 
        C.cCode AS cProductCode, B.cProductSpec BcProductSpec, A.dConfirm, 
        A.dCheck1, C.cParamter, C.cSpec AS cProductSpec, C.cColor, A.cCreator
     FROM 를 주문 WITH (NOLOCK)
     LEFT  JOIN Orders_Product B WITH (NOLOCK) ON A.cID = B.cOrdersID
     LEFT  JOIN 제품 C WITH (NOLOCK) ON B.cProductID = C.cID
     LEFT 가입 (
                             - 生产的产品ID는 
                SELECT  DISTINCT A1.cProductID을
                     FROM dbo.Product_Item A1
                     LEFT  JOIN dbo.Orders_ProductItem A2 ON A1.cProductID = A2.cProductID
                     WHERE A1.iProduct ! =  0 
              D) ON B.cProductID = D.cProductID
     WHERE  1  =  1 
        AND B.cProductID = D.cProductID
         AND A.iCancel =의  ' 0" 
        AND (상태 =  30 
              OR (상태 =  20 
                   AND iNewCRM ! =  1 
                   AND  NOT이  존재는 ( SELECT  1 
                                        FROM Orders_ProductItem WITH (NOLOCK)
                                         상기 iCustom =  1 
                                            AND cOrdersID = A.cID) 
                 ) 
            ) 
        AND (A.iStatusPP =  0 
              OR .iStatusPP =  1 
            ) 
        AND  NOT EXISTS ( SELECT  1 
                            FROM MOrders_Product
                             LEFT가  가입 dbo.MOrders를 ON MOrders.cID = MOrders_Product.cMOrdersID
                             WHERE cOrdersProductID = B.cSubID
                                 AND dbo.MOrders.iStatus ! =  2 )
         AND B.iCancelM =  0 
        AND  NOT  EXISTS (
         SELECT  1 
            FROM DOrders AA
             왼쪽은  가입 DOrders_Sub BB ON을AA.cID = BB.cDOrdersID
             상기 상태 =  3  AND B.cSubID = bb.cOrdersProductID)
     ORDER  BY A.dUDate의 DESC ;

 

다음 기사를 참조 할 수 있습니다 이유 :

 https://www.cnblogs.com/totian/p/7597300.html

 

 

https://blog.csdn.net/zxu_1995/article/details/82388395

 

추천

출처www.cnblogs.com/KevinMO/p/11407588.html