2017-10-12 151 views
1

我正在編寫一個SQL查詢來提取製造數據,並計算出每月與輸出相比的成本。查詢結構非常龐大(超過4個查詢,超過200行)。它需要超過5分鐘才能運行。我不認爲我真的讓它完全運行。SQL查詢需要10分鐘以上的時間才能運行,需要26秒才能拆分兩次

生產成本部分需要13秒才能運行。我無法理解如何運行報告的其餘部分需要很長時間。所以把生產成本放在一張表中,並使用表格運行銷售報告。瞧!現在銷售報告需要13秒!

現在我怎樣才能使我的查詢只需要26秒運行?

以下是銷售報表查詢中用於提取生產成本的一行。 [Production Cost Per Job]是生產成本查詢。

OUTER APPLY (
    SELECT TOP 1 
     bpc.StartingMonth, 
     bol.[Item No_] as ItemNo, 
     SUM(bpc.Amount)/SUM(bpc.Quantity) as Cost 
    FROM "Production Output Line" as bol 
    INNER JOIN [Production Cost Per Job] as bpc 
     ON bol.[JobID] = bpc.[JobID] 
     AND bol."Output Item Size" = bpc.ItemSize 
     AND DATEDIFF(mm, 0, bol.[Starting Date]) = bpc.StartingMonth 
    WHERE bpc.Quantity <> 0 
    AND bpc.StartingMonth <= a.MonthDate 
    AND bpc.StartingMonth >= 1380 -- January 2015 
    AND bol.[Item No_] = a.ItemNo 
    GROUP BY bpc.StartingMonth, bol.[Item No_] 
    ORDER BY bpc.StartingMonth 
) as b 
+0

因爲您正在進行內部連接,您是否嘗試將您的位置邏輯移動到您的連接子句中。 Sql將評估where子句的最後一項,並可能導致查詢嚴重惡化。通過將該邏輯提升到一個水平,它應該更快。 – SFrejofsky

+0

你的意思是把它移到ON? –

+0

對不起,應該已經在條款,而不是加入條款 – SFrejofsky

回答

1

根據你的邏輯,我覺得像下面這樣會很有效的工作(我不知道你有a,所以我剛剛創建a.a_rows還有MonthDate場):

SELECT 
    a_rows 
    , MonthDate 
    , StartingMonth 
    , ItemNo 
    , Cost 
FROM 
    (
     SELECT 
      a_rows 
      , MonthDate 
      , StartingMonth 
      , ItemNo 
      , Cost 
      , ROW_NUMBER() OVER (PARTITION BY a_rows, MonthDate ORDER BY StartingMonth) R 
     FROM 
      (
       SELECT 
        a.a_rows 
        , a.MonthDate 
        , bpc.StartingMonth 
        , bol.[Item No_] ItemNo 
        , SUM(bpc.Amount)/SUM(bpc.Quantity) Cost 
       FROM 
        [a] a 
        LEFT JOIN [Production Output Line] bol ON bol.[Item No_] = a.ItemNo 
        LEFT JOIN [Production Cost Per Job] bpc ON 
         bpc.StartingMonth <= a.MonthDate 
         AND bpc.StartingMonth >= 1380 
         AND bpc.Quantity <> 0 
       GROUP BY 
        a.a_rows 
        , a.MonthDate 
        , bpc.StartingMonth 
        , bol.[Item No_] 
      ) Q 
    ) Q2 
WHERE R = 1 
相關問題