2013-12-03 164 views
0

如何提高效率?它目前正在我22秒運行:查詢更高效

SELECT Id, PNumber, ClassId, ClassType, CreateDate, EndDate 
FROM dbo.tbl 
WHERE DATEDIFF(d, EndDate, GETDATE())< 0 OR EndDate IS NULL 
AND ClassType NOT IN ('A', 'B', 'C') 
AND ClassId IN 
(SELECT MAX(ClassId) FROM dbo.tbl 
WHERE ClassId IN (SELECT ClassId FROM dbo.tbl2 WHERE PNumber= '132456789') 
GROUP BY PNumber) 
+0

你有合適的索引嗎? – asawyer

+0

是的,我們已經檢查過。 – sharcfinz

+0

1)告訴我們DBMS作爲性能調優因SQL產品而異。和2)發佈解釋/查詢計劃。沒有這些,我們真的不能說太多。 – RBarryYoung

回答

0

如何:

SELECT A.Id, A.PNumber, A.ClassId, A.ClassType, A.CreateDate, A.EndDate 
FROM dbo.tbl A, 
(
    SELECT MAX(tbl1.ClassId) AS MaxClassId FROM dbo.tbl tbl1 
    WHERE EXISTS (SELECT 1 FROM dbo.tbl2 tbl2 WHERE tbl2.ClassId = tbl1.ClassId AND tbl2.PNumber= '132456789') 
    GROUP BY PNumber 
) B 
WHERE (A.EndDate IS NULL OR DATEDIFF(d, A.EndDate, GETDATE())< 0) 
AND A.ClassType NOT IN ('A', 'B', 'C') 
AND A.ClassId = B.MaxClassId 

運行它,並讓我知道你的結果。

+0

工作。 。 .. 謝謝!! ..在1秒以下! – sharcfinz

+0

不客氣。 – Loc

0

我將能夠提供更好的查詢,但需要澄清。您的查詢部分

AND ClassId IN (SELECT MAX(ClassId) 
          FROM dbo.tbl 
          WHERE ClassId IN 
          (SELECT ClassId 
            FROM dbo.tbl2 
            WHERE PNumber= '132456789') 
          GROUP BY 
           PNumber) 

將僅返回一個「ClassID」記錄。由於ClassID在兩個表中都是相同的,所以您不需要瀏覽所有內容,並且可以簡化爲。

AND ClassId IN (SELECT MAX(ClassId) 
        FROM dbo.tbl2 
        WHERE PNumber= '132456789') 

由於您的PNumber是單數,沒有必要按它,它只會返回最大()類爲ID進不去。

所以問題......是你打算在得到只從單一的ClassID和運行?

現在,他這樣說,我就重寫一遍,所以這是第一個查詢...獲取您所關心的一類ID,然後讓這種類型的所有其他條目與其他標準。

SELECT 
     T.Id, 
     T.PNumber, 
     T.ClassId, 
     T.ClassType, 
     T.CreateDate, 
     T.EndDate 
    FROM 
     (SELECT MAX(T2.ClassId) MaxClass 
      FROM dbo.tbl2 T2 
      WHERE T2.PNumber= '132456789') OneClass 
     JOIN dbo.tbl T 
      on OneClass.MaxClass = T.ClassID 
      AND NOT T.ClassType IN ('A', 'B', 'C') 
      AND (T.EndDate IS NULL OR DATEDIFF(T.d, T.EndDate, GETDATE()) < 0 ) 

另外請注意,我應用了所有的alias.field引用來保持字段來自哪個表,尤其是當涉及到任何連接時。