문제

SQL Server 2000 서버에서 SQL Server 용 Quest 's 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%이상 높이 올리는지 말해 줄 수 있습니까?

도움이 되었습니까?

해결책

실제 실행 계획을 살펴 보셨습니까? 이들은 SQL Server가 이러한 쿼리를 실행하는 데 취한 다양한 접근법을 보여 주어야합니다.

다른 팁

확실히 이상한 것입니다. 실행 계획은 확실히 알려 주어야하지만 데이터베이스에서 이와 같은 성능 변경은 거의 항상 색인으로 이어집니다. 그래서 가장 좋은 추측은 어떻게 든 SQL Server가 사용할 수있는 색인이 없어졌고 이러한 홀수 변경을 추가하면 더욱 눈에 띄게 만들어 졌다는 것입니다.

그러나 다음에 쿼리를 더 빨리 쓸 수 있도록 '이유'를 배우려면 아무것도 없습니다.

완전한 흔들림 :

FPARTNO가 "NULL NULL"조건을 가지고 있다고 추측 할 것입니다 (따라서 추가 된 필터가 항상 통과). Toad는 SQLServer가> = Char (0)을 항상 검출 할만 큼 똑똑하지 않다는 것을 알고 있습니다. 따라서 이것은 Toad가 매우 비스듬한 방식으로 FPARTNO가있는 것을 사용하도록 최적화를 안내하려고 노력하고 있음을 시사합니다. 무언가가 복합 색인이 될 수 있습니다 (fcinvoice, fpartno) .. 그 중 하나가 있습니까?

다른 사람들이 말했듯이, 설명 계획은 미스터리를 설명하는 데 도움이 될 것입니다.

이러한 변경 사항 중 어느 것도 쿼리의 논리적 의미에 영향을 미치지 않습니다 (즉, "OPS 없음").

ON 절에 대한 Coalesce가 Optimizer가 ARI.FCINVOICE에 대한 색인을 사용하지 않도록하는 것입니다.

마찬가지로, "> = char (0)"이 최적화에 가질 수있는 유일한 물리적 효과 ~할 것 같다 fpartno]가있는 인덱스에서 색인 범위 스캔 (또는 Seek)을 사용하는 것을 고려해야합니다.

그래서 내 결론은 Toad가 실제로 Optimizer가 실제로 특정 색인을 사용하여 특정 색인을 사용하여 조작하려고한다는 것입니다. 강제 명백한 힌트와 함께 해당 색인을 사용하는 것이 좋습니다. 실제로 T-SQL Optimizer 힌트의 실제 문제는 그들의 종속성과 취약성이기 때문에 그것은 일종의 영리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top