2017-10-12 20 views
1

SQLクエリーを作成して製造データを取得し、出力と比較して月あたりのコストを把握しています。クエリの構造は大規模です(4つのクエリに対して200以上の行)。実行には5分以上かかります。私は実際にそれが完全に実行されるとは思わない。SQLクエリーを実行するには10以上の時間がかかり、2回に分割すると26秒かかります

製造コストの部分は、実行に13秒かかります。私は、レポートの残りの部分を実行するにはどうしたら時間がかかるのか理解できませんでした。そこで、生産コストをテーブルに投棄し、テーブルを使用して販売レポートを実行しました。 Voila!今、売上レポートには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

あなたが内部結合をしているということは、where論理を結合節に移そうとしたことです。 Sqlはwhere句を最後に評価し、クエリの深刻な劣化を引き起こす可能性があります。そのロジックをレベルアップさせることではるかに高速になるはずです。 – SFrejofsky

+0

あなたはそれをONに動かすことを意味しますか? –

+0

はい申し訳ありませんが、on節とjoin節ではありませんでした。 – 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 
関連する問題