2017-12-08 5 views
1

私はSSMS2016で作業していると言い、SQLが最大ではないと言っています。多くの結合を含むクエリにmax()を追加すると、パフォーマンスが低下する - 最適化の仕方は?

私はかなりの数の結合を持つクエリを持っていますが、これは遅くても耐えられる20奇数秒で実行されます。

基本的には、CCRサブクエリ(コード内で2行がコメントアウトされています)のrow_numberの最大値である列を追加したいと思いますが、クエリ時間(1000レコードで60秒以上) 。実行時に膨大なジャンプがなくても必要な列を取得できる方法はありますか?また、一般的にクエリをクリーンアップできる方法はありますか?

SELECT DISTINCT AWI.* 
FROM 
(SELECT 
    4 'SORT' 
    , CCR.URN 
    , CCR.SPECIAL_COMMENT 
    , SL.SCHEDULED_SHIP_DATE 
    , CASE WHEN SL.LOAD_CLOSED = 'Y' THEN SL.ACTUAL_SHIP_DATE_TIME ELSE NULL END AS 'ACTUAL_SHIP_DATE' 
    , SL.LOAD_CLOSED 
    , SH.SHIPPING_LOAD_NUM 'SHIPPING_LOAD' 
-- , MAX(CCR.RNK) OVER(PARTITION BY CCR.SHIPPING_LOAD_NUM) 'CTNS_ON_LOAD' 
    , SH.CARRIER 
    , SH.CARRIER_SERVICE 'SERVICE' 
    , IWI.PARENT_INSTR 'WORK_UNIT' 
    , IWI.CONDITION 'WORK_STATUS' 
    , IWI.WORK_TYPE 
    , sl.LOCATION 'DOCK_DOOR' 
    , CCR.CONTAINER_ID 
    , SC.LOCATION 'FROM_LOC' 
    , IWI.TO_LOC 
    , SH.SHIP_TO 
    , G.DESCRIPTION 'COUNTRY' 


    , case when SL.LEADING_STS = '201' then '[201] In Wave' 
      when SL.LEADING_STS = '300' then '[300] Picking Pending' 
      when SL.LEADING_STS = '301' then '[301] In Picking' 
      when SL.LEADING_STS = '400' then '[400] Packing Pending' 
      when SL.LEADING_STS = '401' then '[401] In Packing' 
      when SL.LEADING_STS = '500' then '[500] Pack and Hold Pending' 
      when SL.LEADING_STS = '600' then '[600] Staging Pending' 
      when SL.LEADING_STS = '650' then '[650] Loading Pending' 
      when SL.LEADING_STS = '700' then '[700] Ship Confirm Pending' 
      when SL.LEADING_STS = '800' then '[800] Load Confirm Pending' 
      when SL.LEADING_STS = '900' then '[900] Closed' 
      END AS 'LEADING_STS' 
    , case when SL.TRAILING_STS = '201' then '[201] In Wave' 
      when SL.TRAILING_STS = '300' then '[300] Picking Pending' 
      when SL.TRAILING_STS = '301' then '[301] In Picking' 
      when SL.TRAILING_STS = '400' then '[400] Packing Pending' 
      when SL.TRAILING_STS = '401' then '[401] In Packing' 
      when SL.TRAILING_STS = '500' then '[500] Pack and Hold Pending' 
      when SL.TRAILING_STS = '600' then '[600] Staging Pending' 
      when SL.TRAILING_STS = '650' then '[650] Loading Pending' 
      when SL.TRAILING_STS = '700' then '[700] Ship Confirm Pending' 
      when SL.TRAILING_STS = '800' then '[800] Load Confirm Pending' 
      when SL.TRAILING_STS = '900' then '[900] Closed' 
      END AS 'TRAILING_STS' 
    , CCR.CONTAINER_TYPE 
    , DIMS.WEIGHT 
    , DIMS.LENGTH 
    , DIMS.WIDTH 
    , DIMS.HEIGHT 

FROM 
    IA_WORK_INSTRUCTION IWI 
JOIN 
    (SELECT INTERNAL_SHIPMENT_NUM, SHIP_TO, CARRIER, CARRIER_SERVICE, SHIPPING_LOAD_NUM, SHIP_TO_COUNTRY FROM SHIPMENT_HEADER) SH 
    ON SH.INTERNAL_SHIPMENT_NUM = IWI.INTERNAL_NUM 
JOIN 
    (SELECT c1.INTERNAL_WORK_INST_NUM, c1.CONTAINER_ID, c1.URN, c1.INTERNAL_CONTAINER_NUM, c1.SPECIAL_COMMENT, sc1.container_type, H1.SHIPPING_LOAD_NUM 
-- , ROW_NUMBER() OVER(PARTITION BY H1.SHIPPING_LOAD_NUM ORDER BY C1.CONTAINER_ID DESC) 'RNK' 
    FROM CARTON_CALLOFF_REQUEST c1 
    join shipping_container sc1 
    on sc1.internal_container_num = c1.internal_container_num 
    JOIN SHIPMENT_HEADER H1 
    ON H1.INTERNAL_SHIPMENT_NUM = SC1.INTERNAL_SHIPMENT_NUM 
    ) CCR 
    ON CCR.INTERNAL_WORK_INST_NUM = IWI.PARENT_INSTR 
JOIN 
    (SELECT DISTINCT IDENTIFIER, DESCRIPTION FROM GENERIC_CONFIG_DETAIL WHERE RECORD_TYPE = 'COUNTRY') G 
    ON G.IDENTIFIER = SH.SHIP_TO_COUNTRY 
JOIN 
    (SELECT INTERNAL_SHIPMENT_NUM, PARENT, LOCATION FROM SHIPPING_CONTAINER) SC 
    ON SC.PARENT = CCR.INTERNAL_CONTAINER_NUM AND SC.INTERNAL_SHIPMENT_NUM = SH.INTERNAL_SHIPMENT_NUM 
JOIN 
    (SELECT DISTINCT INTERNAL_CONTAINER_NUM, WEIGHT, LENGTH, WIDTH, HEIGHT FROM SHIPPING_CONTAINER WHERE CONTAINER_ID IS NOT NULL) DIMS 
    ON DIMS.INTERNAL_CONTAINER_NUM = CCR.INTERNAL_CONTAINER_NUM 
JOIN 
    (SELECT s1.INTERNAL_LOAD_NUM, s1.LEADING_STS, s1.TRAILING_STS, s1.LOAD_CLOSED, s1.ACTUAL_SHIP_DATE_TIME, s1.SCHEDULED_SHIP_DATE, s1.DOCK_DOOR, l1.location FROM SHIPPING_LOAD s1 join location l1 on l1.object_id = s1.dock_door WHERE L1.TEMPLATE_FIELD1 = 'DOOR') SL 
    ON SL.INTERNAL_LOAD_NUM = SH.SHIPPING_LOAD_NUM 

) AWI 

WHERE AWI.WORK_TYPE = 'CALL OFF PICK' 
+0

派生テーブルと明示的結合を使用する理由は何ですか?また、これらのサブクエリのDISTINCTもクエリの処理速度を低下させます。 – scsimon

+0

@scsimon私はこのクエリにいくつかの反復をしています。私はそれをより速く実行しようとするためにさまざまなことを試みていました。明示的な結合とほぼ同じ時間に実行されていることを覚えていると思いますので、そのままそのまま残しました。 – Smeghead

答えて

0

パーティションとオーバー()をグループ化してみてください。 グループ別を追加しても問題が発生した場合は、お知らせください。

SELECT DISTINCT AWI.* 
FROM 
(SELECT 
    4 'SORT' 
    , CCR.URN 
    , CCR.SPECIAL_COMMENT 
    , SL.SCHEDULED_SHIP_DATE 
    , CASE WHEN SL.LOAD_CLOSED = 'Y' THEN SL.ACTUAL_SHIP_DATE_TIME ELSE NULL END AS 'ACTUAL_SHIP_DATE' 
    , SL.LOAD_CLOSED 
    , SH.SHIPPING_LOAD_NUM 'SHIPPING_LOAD' 
    , MAX(CCR.RNK) 
    , SH.CARRIER 
    , SH.CARRIER_SERVICE 'SERVICE' 
    , IWI.PARENT_INSTR 'WORK_UNIT' 
    , IWI.CONDITION 'WORK_STATUS' 
    , IWI.WORK_TYPE 
    , sl.LOCATION 'DOCK_DOOR' 
    , CCR.CONTAINER_ID 
    , SC.LOCATION 'FROM_LOC' 
    , IWI.TO_LOC 
    , SH.SHIP_TO 
    , G.DESCRIPTION 'COUNTRY' 


    , case when SL.LEADING_STS = '201' then '[201] In Wave' 
      when SL.LEADING_STS = '300' then '[300] Picking Pending' 
      when SL.LEADING_STS = '301' then '[301] In Picking' 
      when SL.LEADING_STS = '400' then '[400] Packing Pending' 
      when SL.LEADING_STS = '401' then '[401] In Packing' 
      when SL.LEADING_STS = '500' then '[500] Pack and Hold Pending' 
      when SL.LEADING_STS = '600' then '[600] Staging Pending' 
      when SL.LEADING_STS = '650' then '[650] Loading Pending' 
      when SL.LEADING_STS = '700' then '[700] Ship Confirm Pending' 
      when SL.LEADING_STS = '800' then '[800] Load Confirm Pending' 
      when SL.LEADING_STS = '900' then '[900] Closed' 
      END AS 'LEADING_STS' 
    , case when SL.TRAILING_STS = '201' then '[201] In Wave' 
      when SL.TRAILING_STS = '300' then '[300] Picking Pending' 
      when SL.TRAILING_STS = '301' then '[301] In Picking' 
      when SL.TRAILING_STS = '400' then '[400] Packing Pending' 
      when SL.TRAILING_STS = '401' then '[401] In Packing' 
      when SL.TRAILING_STS = '500' then '[500] Pack and Hold Pending' 
      when SL.TRAILING_STS = '600' then '[600] Staging Pending' 
      when SL.TRAILING_STS = '650' then '[650] Loading Pending' 
      when SL.TRAILING_STS = '700' then '[700] Ship Confirm Pending' 
      when SL.TRAILING_STS = '800' then '[800] Load Confirm Pending' 
      when SL.TRAILING_STS = '900' then '[900] Closed' 
      END AS 'TRAILING_STS' 
    , CCR.CONTAINER_TYPE 
    , DIMS.WEIGHT 
    , DIMS.LENGTH 
    , DIMS.WIDTH 
    , DIMS.HEIGHT 

FROM 
    IA_WORK_INSTRUCTION IWI 
JOIN 
    (SELECT INTERNAL_SHIPMENT_NUM, SHIP_TO, CARRIER, CARRIER_SERVICE, SHIPPING_LOAD_NUM, SHIP_TO_COUNTRY FROM SHIPMENT_HEADER) SH 
    ON SH.INTERNAL_SHIPMENT_NUM = IWI.INTERNAL_NUM 
JOIN 
    (SELECT c1.INTERNAL_WORK_INST_NUM, c1.CONTAINER_ID, c1.URN, c1.INTERNAL_CONTAINER_NUM, c1.SPECIAL_COMMENT, sc1.container_type, H1.SHIPPING_LOAD_NUM 
, ROW_NUMBER() OVER(PARTITION BY H1.SHIPPING_LOAD_NUM ORDER BY C1.CONTAINER_ID DESC) 'RNK' 
    FROM CARTON_CALLOFF_REQUEST c1 
    join shipping_container sc1 
    on sc1.internal_container_num = c1.internal_container_num 
    JOIN SHIPMENT_HEADER H1 
    ON H1.INTERNAL_SHIPMENT_NUM = SC1.INTERNAL_SHIPMENT_NUM 
    ) CCR 
    ON CCR.INTERNAL_WORK_INST_NUM = IWI.PARENT_INSTR 
JOIN 
    (SELECT DISTINCT IDENTIFIER, DESCRIPTION FROM GENERIC_CONFIG_DETAIL WHERE RECORD_TYPE = 'COUNTRY') G 
    ON G.IDENTIFIER = SH.SHIP_TO_COUNTRY 
JOIN 
    (SELECT INTERNAL_SHIPMENT_NUM, PARENT, LOCATION FROM SHIPPING_CONTAINER) SC 
    ON SC.PARENT = CCR.INTERNAL_CONTAINER_NUM AND SC.INTERNAL_SHIPMENT_NUM = SH.INTERNAL_SHIPMENT_NUM 
JOIN 
    (SELECT DISTINCT INTERNAL_CONTAINER_NUM, WEIGHT, LENGTH, WIDTH, HEIGHT FROM SHIPPING_CONTAINER WHERE CONTAINER_ID IS NOT NULL) DIMS 
    ON DIMS.INTERNAL_CONTAINER_NUM = CCR.INTERNAL_CONTAINER_NUM 
JOIN 
    (SELECT s1.INTERNAL_LOAD_NUM, s1.LEADING_STS, s1.TRAILING_STS, s1.LOAD_CLOSED, s1.ACTUAL_SHIP_DATE_TIME, s1.SCHEDULED_SHIP_DATE, s1.DOCK_DOOR, l1.location FROM SHIPPING_LOAD s1 join location l1 on l1.object_id = s1.dock_door WHERE L1.TEMPLATE_FIELD1 = 'DOOR') SL 
    ON SL.INTERNAL_LOAD_NUM = SH.SHIPPING_LOAD_NUM 

GROUP BY 
    CCR.URN 
    , CCR.SPECIAL_COMMENT 
    , SL.SCHEDULED_SHIP_DATE 
    , CASE WHEN SL.LOAD_CLOSED = 'Y' THEN SL.ACTUAL_SHIP_DATE_TIME ELSE 
     NULL END 
    , SL.LOAD_CLOSED 
    , SH.SHIPPING_LOAD_NUM 
    , SH.CARRIER 
    , SH.CARRIER_SERVICE 
    , IWI.PARENT_INSTR 
    , IWI.CONDITION 
    , IWI.WORK_TYPE 
    , sl.LOCATION 
    , CCR.CONTAINER_ID 
    , SC.LOCATION 
    , IWI.TO_LOC 
    , SH.SHIP_TO 
    , G.DESCRIPTION 
    , SL.LEADING_STS 
    , TRAILING_STS 
    , CCR.CONTAINER_TYPE 
    , DIMS.WEIGHT 
    , DIMS.LENGTH 
    , DIMS.WIDTH 
    , DIMS.HEIGHT 
) AWI 

WHERE AWI.WORK_TYPE = 'CALL OFF PICK' 
+0

残念ながら、これは質問に全く答えず、結果セットを完全に変更します。 – scsimon

+0

私はあなたのためのクエリを変更しようとしました。私はテーブル構造をローカルに持っていないので、スクリプトをテストすることができません。確認して私に知らせてください。 – Shammas

+0

私は質問をした人ではなく、単に集計を適用し、集計をウィンドウ関数に適用することは同じではなく、結果セットは大きく異なるとコメントしています。 – scsimon

関連する問題