2009-08-28 4 views
1

SQL Server 2000 Server에서 SQL Server 용 Quest의 TOAD를 사용하고 있습니다. (차이가 강조 표시) 다음 쿼리 최적화 - 왜 쿼리 속도가 빨라 집니까?

SELECT CASE SLCE.GroupName WHEN 'Other' THEN ARM.FBCOMPANY 
          WHEN 'Inter Co.' THEN ARM.FBCOMPANY 
          ELSE SLCE.GroupName END AS [Company Name], 
     ARM.fcustno AS [Cust No], 
     ARM.fbcompany AS [Cust Name], 
     ARM.fcinvoice AS [Invoice No], 
     ARM.fdgldate AS [Post Date], 
     year(arm.fdgldate) AS [Year Posted], 
     CASE ARM.fcsource WHEN 'S' THEN 'Shipper' 
         WHEN 'O' THEN 'Sales Order' 
         WHEN 'R' THEN 'Receiver' 
         WHEN 'C' THEN 'Customer' 
         ELSE ARM.fcsource END AS [Source Doc Type], 
     CASE ARM.fcstatus WHEN 'N' THEN 'New' 
         WHEN 'U' THEN 'Unpaid' 
         WHEN 'P' THEN 'Partially Paid' 
         WHEN 'F' THEN 'Paid in Full' 
         WHEN 'H' THEN 'Held' 
         WHEN 'V' THEN 'Voided' 
         ELSE ARM.fcstatus END AS [Invoice Status], 
     ARM.fpono AS [Cust PO No], 
     ARM.fsalespn AS [Sales Person], 
     ARI.fitem AS [Item No], 
     ARI.fprodcl AS [Prod Class], 
     ARI.fshipkey AS [Qty Invoiced], 
     ARI.ftotprice AS [Net Invoiced], 
     ARI.fpartno AS [Part No], 
     ARI.frev AS [Part Rev], 
     cast(ARI.fmdescript AS VARCHAR(20)) AS [Part Description], 
     ARM.fsono AS [Sales No], 
     ARI.fsokey AS [SO Rels Key], 
     ARI.fordqty AS [Qty Ordered], 
     RED.[YEAR] AS [Year], 
     RED.PERIOD AS [RF Period] 
    FROM dbo.armast ARM 
     INNER JOIN dbo.aritem ARI 
      ON ARM.FCINVOICE = ARI.FCINVOICE 
     INNER JOIN slcdpm SLC 
      ON SLC.fcustno = ARM.fcustno 
     LEFT OUTER JOIN slcdpm_ext SLCE 
     ON SLC.identity_column = SLCE.fkey_id 
     INNER JOIN REDFRIDAYDATES..TBLREDFRIDAYALLDATES RED 
      ON RED.date = CAST (FLOOR (CAST (ARM.fdgldate AS FLOAT)) AS DATETIME) 
WHERE ARM.fcstatus <> 'V' 
    AND RED.[YEAR] = year(getdate()) 
    AND ari.frev = 'REP' 
    AND ARI.fsalesacc IN ('4010001', '4010002', '4010003', '4010004', '4010005', '4010006', '4010007', '4010008', '4010009', '4010010', '4010018', '4010019', '4010020', '4010021', '4010031', '4010050', '4022000', '4031000', '4045000', '4055000', '4057000', '4060000', '4070000') 

가 두꺼비의 선택입니다 : : 그 유착 및 추가하고 문이 쿼리 속도를 왜

INNER JOIN dbo.aritem ARI 
      ON ARM.FCINVOICE = ***COALESCE (ARI.FCINVOICE , ARI.FCINVOICE)*** 
     INNER JOIN slcdpm SLC 
      ON SLC.fcustno = ARM.fcustno 
     LEFT OUTER JOIN slcdpm_ext SLCE 
     ON SLC.identity_column = SLCE.fkey_id 
     INNER JOIN REDFRIDAYDATES..TBLREDFRIDAYALLDATES RED 
      ON RED.date = CAST (FLOOR (CAST (ARM.fdgldate AS FLOAT)) AS DATETIME) 
WHERE ARM.fcstatus <> 'V' 
    AND RED.[YEAR] = year(getdate()) 
    AND ari.frev = 'REP' 
    AND ARI.fsalesacc IN ('4010001', '4010002', '4010003', '4010004', '4010005', '4010006', '4010007', '4010008', '4010009', '4010010', '4010018', '4010019', '4010020', '4010021', '4010031', '4010050', '4022000', '4031000', '4045000', '4055000', '4057000', '4060000', '4070000') 
    ***AND ARI.[fpartno] >= CHAR(0)*** 

은 누군가가 말해 주시겠습니까 여기

내 쿼리입니다 50 % 이상?

답변

3

실제 실행 계획을 살펴 보셨습니까? 이들은 SQL Server가 이러한 쿼리를 실행하는 데 사용한 다양한 접근 방식을 보여줍니다.

1

확실히 이상한 것입니다. 실행 계획은 확실히 알려주지 만 데이터베이스와 같은 성능 변화는 거의 항상 색인으로 내려갑니다. 그래서 내 최고의 추측은 어떻게 든 SQL Server는 사용할 수있는 인덱스가 누락되었다는 것이며 이러한 이상한 변화를 추가하면 더 잘 나타납니다.

그러나 왜 '왜'관련되어 있는지 궁금해지면 다음에 더 빨리 쿼리를 작성할 수 있으므로 실제로는 아무 것도 없습니다.

1

전체 WAG : 나는 fpartno이에 "null가 아닌"상태를 (그래서 추가 된 필터는 항상 통과)이 있는지, 그리고 두꺼비가 SQLServer를 알고 일이 추측하기 위하여려고하고있다

충분히 스마트하지 않다 > = CHAR (0)이 항상 참임을 감지하십시오. 그래서 이것은 Toad가 옵티마이 저가 매우 사소한 방식으로 가이드를 사용하여 fpartno가있는 것을 사용하려고합니다. 그게 무언가가 (fcinvoice, fpartno) 복합 지수가 될 수 있습니다. 그 중 하나가 있습니까?

다른 사람들처럼, 설명 계획은 신비를 설명하는 데 도움이 될 것입니다. 어느 이러한 변화의

1

쿼리의 논리적 의미에 아무런 영향이

ON 절에 COALESCE가의 최적화를 방지하는 것입니다 유일한 물리적 효과 (즉, 그들은 "어떤 작전"은 없습니다) ARI.FCINVOICE에 대한 색인을 사용하려고합니다. 마찬가지로

은 "> = CHAR (0)"한 인덱스에 (또는도 추구) 인덱스 범위 스캔을 사용하여 고려를 자극 할 수 있습니다 최적화 에 미칠 수있는 유일한 물리적 효과 아리, 그 안에.

결론적으로 TOAD는 옵티마이 저가 특정 인덱스를 실제로 사용하지 않고 명시 적 힌트를 사용하여 인덱스를 사용하도록 조작하려고합니다. 실제로 T-SQL 최적화 프로그램의 힌트가 갖는 실제 문제는 종속성과 취약성이라는 점에서 현명합니다.

관련 문제