私は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'
派生テーブルと明示的結合を使用する理由は何ですか?また、これらのサブクエリのDISTINCTもクエリの処理速度を低下させます。 – scsimon
@scsimon私はこのクエリにいくつかの反復をしています。私はそれをより速く実行しようとするためにさまざまなことを試みていました。明示的な結合とほぼ同じ時間に実行されていることを覚えていると思いますので、そのままそのまま残しました。 – Smeghead