2017-06-07 26 views
1

私はこのクエリを書いており、一時テーブル(初めての使用)を使用したため、クエリのパフォーマンスが大幅に低下しました。テンポラリテーブルの強制終了パフォーマンス

これはクエリです。私が作っている大きなミスを発見できますか?

SET NOCOUNT ON; 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

DECLARE @StartDate DATETIME 
SET @StartDate = '20160720'; 
DECLARE @EndDate DATETIME 
SET @EndDate = '20160729 23:59:59'; 

Select 
SUM(c.[Chargeable Weight]) AS [1stchargeableweights], 
mm.MovementRef [movementref], 
MAX (ts.systemstamp) [lastdate] 
Into #1schargslack 

            FROM  dbo.whsConsignment wc 
                 INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = wc.ConsignmentReference 
                 INNER JOIN dbo.tsAdditionalColInfo ts on ts.[ConsignmentReference]= wc.ConsignmentReference 
                 inner join dbo.movConLink m on m.ConsignmentReference = c.[Consignment Reference] 
                 inner join dbo.movMovement mm on mm.MovementID = m.MovementID 
                 --INNER JOIN dbo.whsHeader wh ON wh.WhsHeaderID = wc.whsHeaderID 
                            --AND wc.whsHeaderID = wh.WhsHeaderID 
                            AND wc.StatusCode = 'NL' 
                            AND c.[Service Type] = 'F' 
                            AND ts.SlackNoSlack = 'slack' 
                            or ts.slacknoslack like 'slack - tripped%' 
                            GROUP by mm.MovementRef 
Select 
SUM(c.[Chargeable Weight]) AS [1stchargeableweightns], 
mm.MovementRef [movementref], 
MAX (ts.systemstamp) [lastdate] 
Into #1chargns 


            FROM  dbo.whsConsignment wc              INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = wc.ConsignmentReference 
                 INNER JOIN dbo.tsAdditionalColInfo ts on ts.[ConsignmentReference]= wc.ConsignmentReference 
                 inner join dbo.movConLink m on m.ConsignmentReference = c.[Consignment Reference] 
                 inner join dbo.movMovement mm on mm.MovementID = m.MovementID 
                 --INNER JOIN dbo.whsHeader wh ON wh.WhsHeaderID = wc.whsHeaderID 
                            --AND wc.whsHeaderID = wh.WhsHeaderID 
                            AND wc.StatusCode = 'NL' 
                            AND c.[Service Type] = 'F' 
                            and ts.SlackNoSlack like 'no slack%' 
                            GROUP BY mm.MovementRef 
Select 
SUM(c.[Chargeable Weight]) AS [2ndchargeableweights], 
mm.MovementRef [movementref], 
MAX (ts.systemstamp) [lastdate] 
Into #2chargs 

            FROM  dbo.whsConsignment wc 
                 INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = wc.ConsignmentReference 
                 INNER JOIN dbo.tsAdditionalColInfo ts on ts.[ConsignmentReference]= wc.ConsignmentReference 
                 inner join dbo.movConLink m on m.ConsignmentReference = c.[Consignment Reference] 
                 inner join dbo.movMovement mm on mm.MovementID = m.MovementID 
                 -- INNER JOIN dbo.whsHeader wh ON wh.WhsHeaderID = wc.whsHeaderID 
                               -- AND wc.whsHeaderID = wh.WhsHeaderID 
                               AND wc.StatusCode = 'NL' 
                               AND c.[Service Type] = 'C' 
                               AND ts.SlackNoSlack = 'slack' 
                               or ts.slacknoslack like 'slack - tripped%' 
                               GROUP BY mm.MovementRef                                                       
Select 
SUM(c.[Chargeable Weight]) AS [2ndchargeableweightns], 
mm.MovementRef [movementref], 
MAX (ts.systemstamp) [lastdate] 
Into #2chargns 

            FROM  dbo.whsConsignment wc 
                 INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = wc.ConsignmentReference 
                 INNER JOIN dbo.tsAdditionalColInfo ts on ts.[ConsignmentReference]= wc.ConsignmentReference 
                 inner join dbo.movConLink m on m.ConsignmentReference = c.[Consignment Reference] 
                 inner join dbo.movMovement mm on mm.MovementID = m.MovementID 
                 -- INNER JOIN dbo.whsHeader wh ON wh.WhsHeaderID = wc.whsHeaderID 
                               -- AND wc.whsHeaderID = wh.WhsHeaderID 
                               AND wc.StatusCode = 'NL' 
                               AND c.[Service Type] = 'C' 
                               and ts.SlackNoSlack like 'no slack%' 
                               group by mm.MovementRef 
Select 
SUM(c.[Chargeable Weight]) AS [2ndchargeableweightlate], 
mm.MovementRef [movementref], 
MAX (ts.systemstamp) [lastdate] 
Into #2charglate 

            FROM  dbo.whsConsignment wc 
                 INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = wc.ConsignmentReference 
                 INNER JOIN dbo.tsAdditionalColInfo ts on ts.[ConsignmentReference]= wc.ConsignmentReference 
                 inner join dbo.movConLink m on m.ConsignmentReference = c.[Consignment Reference] 
                 inner join dbo.movMovement mm on mm.MovementID = m.MovementID 
                 -- INNER JOIN dbo.whsHeader wh ON wh.WhsHeaderID = wc.whsHeaderID 
                               -- AND wc.whsHeaderID = wh.WhsHeaderID 
                               AND wc.StatusCode = 'NL' 
                               AND c.[Service Type] = 'C'                     
                               and ts.SlackNoSlack like '%late%' 
                               group by mm.movementref 
    SELECT --wh.WhsHeaderID, 
       mu.Number AS Unit, 
     m.MovementRef AS Reference, 
     wh.ArrDepDate AS [Departure Date], 
     wh.LastScannedTime AS [Last Scan], 
     CONVERT(VARCHAR(5), wh.ArrDepDate, 108) AS [Scheduled Departure (h)], 
     CONVERT(VARCHAR(5), wh.LastScannedTime, 108) AS [Last Scan (h)],     
     CASE 
      WHEN 
      (
       m.DestinationPoint = 'SF' 
       AND DATEDIFF(MINUTE, wh.ArrDepDate, wh.LastScannedTime) > 180 
      ) 
      OR (m.DestinationPoint <> 'SF' AND DATEDIFF(MINUTE, wh.ArrDepDate, wh.LastScannedTime) > 20) THEN 
       'Late' 
      ELSE 
       'On Time' 
     END AS Status, 
     CAST(ch.ChargeableWt + ISNULL(LO.LeftOffWt, 0) AS DECIMAL(18, 2)) AS [Planned Chargeable Wt], 
     Cast (isnull ([1stchargeableweights], 0) as decimal (18, 2)) as [1st Dep Left off Chargeable Wt With Slack], 
     Cast (isnull ([1stchargeableweightns], 0) as decimal (18, 2)) as [1st Dep Left off Chargeable Wt No Slack], 
     Cast (isnull ([2ndchargeableweights], 0) as decimal (18, 2)) as [2nd Dep Left off Chargeable Wt With Slack], 
     Cast (isnull ([2ndchargeableweightns], 0) as decimal (18, 2)) as [2nd Dep Left off Chargeable Wt No Slack], 
     Cast (isnull ([2ndchargeableweightlate], 0) as decimal (18, 2)) as [2nd Dep Left off Chargeable Wt Late], 
     CAST(ch.ChargeableWt AS DECIMAL(18, 2)) AS [Actual Chargeable Wt], 

     CASE 
      WHEN m.DestinationPoint IN ('AT', 'FR', 'PL', 'NL', 'BE', 'ES', 'IT', 'CH', 'CZ', 'TU', 'MT', 'DE') THEN 
       22000 
      ELSE 
       20000 
     END AS Target, 
     CASE 
      WHEN m.DestinationPoint IN ('AT', 'FR', 'PL', 'NL', 'BE', 'ES', 'IT', 'CH', 'CZ', 'TU', 'MT', 'DE') THEN 
       CAST(ch.ChargeableWt - 22000 AS DECIMAL(18, 2)) 
      ELSE 
       CAST(ch.ChargeableWt - 20000 AS DECIMAL(18, 2)) 
     END AS Variance 
     --ISNULL(
     --   STUFF(
     --         (
     --           SELECT ', ' + COALESCE(R.Region, 'Region not found') + ': ' + SUBSTRING(cnor.PostCode,1,CHARINDEX( ' ',cnor.PostCode + ' ') - 1) + 
     --                 ' (' + COALESCE(DC.Description, 'NA') + ')' 
     --           FROM dbo.whsConsignment wc 
     --             INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = wc.ConsignmentReference AND c.Cancelled = 0 
     --             INNER JOIN dbo.genAddress cnor ON cnor.AddressID = c.Consignor 
     --             LEFT OUTER JOIN dbo.disConsignment AS DC ON DC.ConsignmentRef = wc.ConsignmentReference AND DC.WhsHeaderID = wc.whsHeaderID 
     --             LEFT JOIN dbo.lstPostcode P ON P.Postcode = cnor.PostcodePrefix 
     --             LEFT JOIN dbo.lstPostcodeRegion R ON R.RegionID = P.RegionID 
     --           WHERE wc.whsHeaderID = wh.WhsHeaderID AND wc.StatusCode = 'NL' 
     --           FOR XML PATH('') 
     --          ), 
     --     1,1,'' 
     --    ) 
     --  ,'') AS [Postcodes & Discrepancies]  
    FROM dbo.movMovement m 
    inner join #1schargslack on #1schargslack.movementref = m.MovementRef 
    inner join #1chargns on #1chargns.movementref = m.MovementRef 
    inner join #2chargs on #2chargs.movementref = m.MovementRef 
    inner join #2chargns on #2chargns.MovementRef = m.MovementRef 
    inner join #2charglate on #2charglate.movementref = m.MovementRef 
     INNER JOIN dbo.movUnit mu ON mu.UnitID = m.TrailerID 
     INNER JOIN dbo.whsHeader wh ON wh.RunMovID = m.MovementID AND wh.LocalDepotCode = 'NOT' AND wh.WhsJobType = 'CL' AND wh.WhsJobStatus = 'COMP' 
     LEFT JOIN dbo.whsHeaderComments whc ON whc.ID = wh.WhsHeaderID 
     INNER JOIN (
             SELECT MovementID, 
               SUM(c.[Chargeable Weight]) AS ChargeableWt 
             FROM dbo.movConLink mc 
               INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = mc.ConsignmentReference AND c.Cancelled = 0 
             GROUP BY mc.MovementID 
           ) ch ON ch.MovementID = m.MovementID 
     LEFT JOIN (
            SELECT wc.whsHeaderID, 
             SUM(c.[Chargeable Weight]) AS LeftOffWt 
            FROM dbo.whsConsignment wc 
             INNER JOIN dbo.cgtConsignment c ON c.[Consignment Reference] = wc.ConsignmentReference AND c.Cancelled = 0 
             INNER JOIN dbo.genAddress cnor ON cnor.AddressID = c.Consignor 
            WHERE StatusCode IN ('NL') 
            GROUP BY wc.whsHeaderID 
          ) LO ON LO.whsHeaderID = wh.WhsHeaderID 
    WHERE wh.ArrDepDate 
    BETWEEN @StartDate AND @EndDate 
    ORDER BY m.MovementRef; 
+2

スタックオーバーフローはこの方法では機能しません。何百行ものSQLコードをダンプすることはできず、誰かがそれを見抜くことを期待することはできません。あなたの質問を編集し、一時的なテーブルに問題がある_one_クエリを表示してください。 –

+0

質問には関係ありませんが、SQL Serverの初心者であれば、これは適切な設定ではありません。 'TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; – Horia

+0

こんにちはHoria、あなたはそれを拡張していただけますか?なぜ、SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDであるのですか?不適切ですか?ありがとうございました! –

答えて

0

一時テーブルを作成してから、それを一度だけ呼び出す場合は、CTEを使用して見ることができます。 SQL Serverがテーブルにデータを入力する時間を大幅に節約できます。

+1

華麗な、dbajtrありがとう!私はCTEを使って調べます:) –

+0

あなたの使用しているテンポラリテーブルがクエリの終わりにそれらを削除することを忘れないでも – dbajtr

関連する問題