需要帮助优化SQL Server查询吗
我正在处理我们的报告数据库。我们目前的数据转储过程一直有很多问题,我正试图重新设计它 每小时,我们都会将生产数据添加到表中。具体说一个表,它只有100多万行(通常更少)。我需要获取这些行并将其附加到reporting server表中。目前,我正在使用一个使用合并进程的存储过程(使用目标、源技术)。每小时运行大约需要16分钟。有谁对追加/更新行有更好的想法吗?我们访问的生产表也只包含今天的数据,所以我甚至不需要添加日期过滤器来减少数据负载。优化性能的最佳方法是什么? 以下是执行计划: 以下是程序:需要帮助优化SQL Server查询吗,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,我正在处理我们的报告数据库。我们目前的数据转储过程一直有很多问题,我正试图重新设计它 每小时,我们都会将生产数据添加到表中。具体说一个表,它只有100多万行(通常更少)。我需要获取这些行并将其附加到reporting server表中。目前,我正在使用一个使用合并进程的存储过程(使用目标、源技术)。每小时运行大约需要16分钟。有谁对追加/更新行有更好的想法吗?我们访问的生产表也只包含今天的数据,所以我甚至不需要添加日期过滤器来减少数据负载。优化性能的最佳方法是什么? 以下是执行计划: 以下是程序
CREATE PROCEDURE dbo.spINSERT_FULL_ORDERHEADER
AS
BEGIN
WITH ORDER_DETAIL_V2 AS(
SELECT
'DCMS' AS SOURCE,
DC_ORDER_NUMBER,
DCMS_ORDER_TYPE,
CUSTOMER_PURCHASE_ORDER_ID,
BILL_TO,
CUSTOMER_MASTER_RECORD_TYPE,
SHIP_TO,
SALES_ORDER,
MERCHANDISE_STYLE,
MERCHANDISE_SIZE_1,
CONCAT(SUBSTRING(MERCHANDISE_STYLE,3,6),'-',
SUBSTRING(MERCHANDISE_STYLE,9,3)) AS MATERIAL,
SUBSTRING(MERCHANDISE_STYLE,14,2) AS QUALITY,
ORDER_QTY,
ORDER_SELECTED_QTY,
ORDER_SHIPPED_QTY,
RELEASED_QTY,
PICK_QTY,
PACKED_QTY,
RELEASED_CARTONS,
FULL_CASE_PICK_COUNT,
TOTE_COUNT,
SPECIAL_PROCESS_CODE_1,
SPECIAL_PROCESS_CODE_2,
SPECIAL_PROCESS_CODE_3,
ORDER_DETAIL_STATUS,
ORDER_CARRIER,
CARRIER_SERVICE_ID,
CAST(CONVERT(VARCHAR, CREATE_DATE) AS DATE) AS CREATE_DATE,
LEFT(cast(dateadd(hh,2,LEFT(RIGHT(CONCAT('000000', CREATE_TIME),6), 2)+':'+SUBSTRING(RIGHT(CONCAT('000000', CREATE_TIME), 6), 3, 2)+':'+RIGHT(RIGHT(CONCAT('000000', CREATE_TIME), 8), 2)) AS TIME),8) AS CREATE_TIME,
CAST(CONVERT(VARCHAR, ALLOCATION_DATE) AS DATE) AS ALLOCATION_DATE,
CAST(CONVERT(VARCHAR, REQUESTED_SHIP_DATE) AS DATE) AS REQUESTED_SHIP_DATE,
CAST(CONVERT(VARCHAR, CANCEL_DATE) AS DATE) AS CANCEL_DATE,
CASE
WHEN DISPATCH_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, DISPATCH_DATE) AS DATE)
END AS DISPATCH_DATE,
CASE
WHEN RELEASED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, RELEASED_DATE) AS DATE)
END AS RELEASED_DATE,
LEFT(RIGHT(CONCAT('000000', RELEASED_TIME), 6), 2)+':'+SUBSTRING(RIGHT(CONCAT('000000',
RELEASED_TIME), 6), 3, 2) +':'+ RIGHT(RIGHT(CONCAT('000000', RELEASED_TIME), 6), 2) AS RELEASED_TIME,
PRIORITY_ORDER,
PARTIAL_SHIP,
SHIPMENT_CARTONS,
SCANNED_CARTONS,
STAGED_CARTONS,
LOADED_CARTONS,
CASE
WHEN INVOICE_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, INVOICE_DATE) AS DATE)
END AS INVOICE_DATE,
SHIPPING_LOAD_NUMBER,
STARTING_WAVE,
ENDING_WAVE,
CASE
WHEN STAGED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, STAGED_DATE) AS DATE)
END AS STAGED_DATE,
ORDER_HDR_STATUS,
LEFT(HOST_ORDER_NUMBER, 9) AS DELIVERY_NUMBER,
CASE
WHEN NOT_SELECTED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, NOT_SELECTED_DATE) AS DATE)
END AS NOT_SELECTED_DATE,
LEFT(RIGHT(CONCAT('000000', NOT_SELECTED_TIME), 6), 2)+':'+SUBSTRING(RIGHT(CONCAT('000000', NOT_SELECTED_TIME), 6), 3, 2)+':'+RIGHT(RIGHT(CONCAT('000000', NOT_SELECTED_TIME), 6), 2) AS NOT_SELECTED_TIME,
NOT_SELECTED_REASON,
CAST(CONVERT(VARCHAR, EST_DEL_DT) AS DATE) AS EST_DEL_DATE,
CONCAT(DC_ORDER_NUMBER,MERCHANDISE_STYLE,MERCHANDISE_SIZE_1,CREATE_DATE) AS [KEY]
FROM OPENQUERY(MEMDWPR1,'
SELECT
OHORNO AS DC_ORDER_NUMBER,
OHORTY AS DCMS_ORDER_TYPE,
OHCUPO AS CUSTOMER_PURCHASE_ORDER_ID,
OHBLTO AS BILL_TO,
OHCURT AS CUSTOMER_MASTER_RECORD_TYPE,
OHSHTO AS SHIP_TO,
OHSAOR AS SALES_ORDER,
ODMRSY AS MERCHANDISE_STYLE,
ODMRS1 AS MERCHANDISE_SIZE_1,
ODORQT AS ORDER_QTY,
ODORSL AS ORDER_SELECTED_QTY,
ODORSH AS ORDER_SHIPPED_QTY,
OHRLQT AS RELEASED_QTY,
OHPKQT AS PICK_QTY,
OHPDQT AS PACKED_QTY,
OHRLCA AS RELEASED_CARTONS,
OHFCCT AS FULL_CASE_PICK_COUNT,
OHTOCT AS TOTE_COUNT,
ODSP01 AS SPECIAL_PROCESS_CODE_1,
ODSP02 AS SPECIAL_PROCESS_CODE_2,
ODSP03 AS SPECIAL_PROCESS_CODE_3,
ODODST AS ORDER_DETAIL_STATUS,
OHORCR AS ORDER_CARRIER,
OHCRSV AS CARRIER_SERVICE_ID,
OHCRDT AS CREATE_DATE,
OHCRTM AS CREATE_TIME,
OHALDT AS ALLOCATION_DATE,
OHRQDT AS REQUESTED_SHIP_DATE,
OHCNDT AS CANCEL_DATE,
OHDIDT AS DISPATCH_DATE,
OHRLDT AS RELEASED_DATE,
OHRLTM AS RELEASED_TIME,
OHORPY AS PRIORITY_ORDER,
OHPLSH AS PARTIAL_SHIP,
OHSHCA AS SHIPMENT_CARTONS,
OHSNCA AS SCANNED_CARTONS,
OHSGCA AS STAGED_CARTONS,
OHLDCA AS LOADED_CARTONS,
OHIVDT AS INVOICE_DATE,
OHLDNO AS SHIPPING_LOAD_NUMBER,
OHWVST AS STARTING_WAVE,
OHWVED AS ENDING_WAVE,
OHSGDT AS STAGED_DATE,
OHOHST AS ORDER_HDR_STATUS,
OHHSOR AS HOST_ORDER_NUMBER,
OHSLDT AS NOT_SELECTED_DATE,
OHSLTM AS NOT_SELECTED_TIME,
OHSLRS AS NOT_SELECTED_REASON,
OHEXDD AS EST_DEL_DT
FROM DSV052BDTA.OHORDR00@MEMWMS2.WORLD
JOIN DSV052BDTA.ODORDR00@MEMWMS2.WORLD
ON ODORNO = OHORNO
')
GROUP BY
DC_ORDER_NUMBER,
DCMS_ORDER_TYPE,
CUSTOMER_PURCHASE_ORDER_ID,
BILL_TO,
CUSTOMER_MASTER_RECORD_TYPE,
SHIP_TO,
SALES_ORDER,
MERCHANDISE_STYLE,
MERCHANDISE_SIZE_1,
CONCAT(SUBSTRING(MERCHANDISE_STYLE,3,6),'-',
SUBSTRING(MERCHANDISE_STYLE,9,3)),
SUBSTRING(MERCHANDISE_STYLE,14,2),
ORDER_QTY,
ORDER_SELECTED_QTY,
ORDER_SHIPPED_QTY,
RELEASED_QTY,
PICK_QTY,
PACKED_QTY,
RELEASED_CARTONS,
FULL_CASE_PICK_COUNT,
TOTE_COUNT,
SPECIAL_PROCESS_CODE_1,
SPECIAL_PROCESS_CODE_2,
SPECIAL_PROCESS_CODE_3,
ORDER_DETAIL_STATUS,
ORDER_CARRIER,
CARRIER_SERVICE_ID,
CAST(CONVERT(VARCHAR, CREATE_DATE) AS DATE),
LEFT(cast(dateadd(hh,2,LEFT(RIGHT(CONCAT('000000', CREATE_TIME),6), 2)+':'+SUBSTRING(RIGHT(CONCAT('000000', CREATE_TIME), 6), 3, 2)+':'+RIGHT(RIGHT(CONCAT('000000', CREATE_TIME), 8), 2)) AS TIME),8),
CAST(CONVERT(VARCHAR, ALLOCATION_DATE) AS DATE) ,
CAST(CONVERT(VARCHAR, REQUESTED_SHIP_DATE) AS DATE) ,
CAST(CONVERT(VARCHAR, CANCEL_DATE) AS DATE) ,
CASE
WHEN DISPATCH_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, DISPATCH_DATE) AS DATE)
END,
CASE
WHEN RELEASED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, RELEASED_DATE) AS DATE)
END,
LEFT(RIGHT(CONCAT('000000', RELEASED_TIME), 6), 2)+':'+SUBSTRING(RIGHT(CONCAT('000000',
RELEASED_TIME), 6), 3, 2) +':'+ RIGHT(RIGHT(CONCAT('000000', RELEASED_TIME), 6), 2) ,
PRIORITY_ORDER,
PARTIAL_SHIP,
SHIPMENT_CARTONS,
SCANNED_CARTONS,
STAGED_CARTONS,
LOADED_CARTONS,
CASE
WHEN INVOICE_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, INVOICE_DATE) AS DATE)
END,
SHIPPING_LOAD_NUMBER,
STARTING_WAVE,
ENDING_WAVE,
CASE
WHEN STAGED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, STAGED_DATE) AS DATE)
END,
ORDER_HDR_STATUS,
LEFT(HOST_ORDER_NUMBER, 9),
CASE
WHEN NOT_SELECTED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, NOT_SELECTED_DATE) AS DATE)
END,
LEFT(RIGHT(CONCAT('000000', NOT_SELECTED_TIME), 6), 2)+':'+SUBSTRING(RIGHT(CONCAT('000000', NOT_SELECTED_TIME), 6), 3, 2)+':'+RIGHT(RIGHT(CONCAT('000000', NOT_SELECTED_TIME), 6), 2),
NOT_SELECTED_REASON,
CAST(CONVERT(VARCHAR, EST_DEL_DT) AS DATE),
CONCAT(DC_ORDER_NUMBER,MERCHANDISE_STYLE,MERCHANDISE_SIZE_1,CREATE_DATE)
)
MERGE BUSINESSPLANNING_TEST.dbo.[FullOrderHeader] AS TARGET
USING ORDER_DETAIL_V2 AS SOURCE
ON TARGET.[KEY] = SOURCE.[KEY]
WHEN MATCHED THEN
UPDATE SET
TARGET.[SOURCE] = SOURCE.[SOURCE],
TARGET.DC_ORDER_NUMBER = SOURCE.DC_ORDER_NUMBER,
TARGET.DCMS_ORDER_TYPE = SOURCE.DCMS_ORDER_TYPE,
TARGET.CUSTOMER_PURCHASE_ORDER_ID = SOURCE.CUSTOMER_PURCHASE_ORDER_ID,
TARGET.BILL_TO = SOURCE.BILL_TO,
TARGET.CUSTOMER_MASTER_RECORD_TYPE = SOURCE.CUSTOMER_MASTER_RECORD_TYPE,
TARGET.SHIP_TO = SOURCE.SHIP_TO,
TARGET.SALES_ORDER = SOURCE.SALES_ORDER,
TARGET.MERCHANDISE_STYLE = SOURCE.MERCHANDISE_STYLE,
TARGET.MERCHANDISE_SIZE_1 = SOURCE.MERCHANDISE_SIZE_1,
TARGET.MATERIAL = SOURCE.MATERIAL,
TARGET.QUALITY = SOURCE.QUALITY,
TARGET.ORDER_QTY = SOURCE.ORDER_QTY,
TARGET.ORDER_SELECTED_QTY = SOURCE.ORDER_SELECTED_QTY,
TARGET.ORDER_SHIPPED_QTY = SOURCE.ORDER_SHIPPED_QTY,
TARGET.RELEASED_QTY = SOURCE.RELEASED_QTY,
TARGET.PICK_QTY = SOURCE.PICK_QTY,
TARGET.PACKED_QTY = SOURCE.PACKED_QTY,
TARGET.RELEASED_CARTONS = SOURCE.RELEASED_CARTONS,
TARGET.FULL_CASE_PICK_COUNT = SOURCE.FULL_CASE_PICK_COUNT,
TARGET.TOTE_COUNT = SOURCE.TOTE_COUNT,
TARGET.SPECIAL_PROCESS_CODE_1 = SOURCE.SPECIAL_PROCESS_CODE_1,
TARGET.SPECIAL_PROCESS_CODE_2 = SOURCE.SPECIAL_PROCESS_CODE_2,
TARGET.SPECIAL_PROCESS_CODE_3 = SOURCE.SPECIAL_PROCESS_CODE_3,
TARGET.ORDER_DETAIL_STATUS = SOURCE.ORDER_DETAIL_STATUS,
TARGET.ORDER_CARRIER = SOURCE.ORDER_CARRIER,
TARGET.CARRIER_SERVICE_ID = SOURCE.CARRIER_SERVICE_ID,
TARGET.CREATE_DATE = SOURCE.CREATE_DATE,
TARGET.CREATE_TIME = SOURCE.CREATE_TIME,
TARGET.ALLOCATION_DATE = SOURCE.ALLOCATION_DATE,
TARGET.REQUESTED_SHIP_DATE = SOURCE.REQUESTED_SHIP_DATE,
TARGET.CANCEL_DATE = SOURCE.CANCEL_DATE,
TARGET.DISPATCH_DATE = SOURCE.DISPATCH_DATE,
TARGET.RELEASED_DATE = SOURCE.RELEASED_DATE,
TARGET.RELEASED_TIME = SOURCE.RELEASED_TIME,
TARGET.PRIORITY_ORDER = SOURCE.PRIORITY_ORDER,
TARGET.PARTIAL_SHIP = SOURCE.PARTIAL_SHIP,
TARGET.SHIPMENT_CARTONS = SOURCE.SHIPMENT_CARTONS,
TARGET.SCANNED_CARTONS = SOURCE.SCANNED_CARTONS,
TARGET.STAGED_CARTONS = SOURCE.STAGED_CARTONS,
TARGET.LOADED_CARTONS = SOURCE.LOADED_CARTONS,
TARGET.INVOICE_DATE = SOURCE.INVOICE_DATE,
TARGET.SHIPPING_LOAD_NUMBER = SOURCE.SHIPPING_LOAD_NUMBER,
TARGET.STARTING_WAVE = SOURCE.STARTING_WAVE,
TARGET.ENDING_WAVE = SOURCE.ENDING_WAVE,
TARGET.STAGED_DATE = SOURCE.STAGED_DATE,
TARGET.ORDER_HDR_STATUS = SOURCE.ORDER_HDR_STATUS,
TARGET.DELIVERY_NUMBER = SOURCE.DELIVERY_NUMBER,
TARGET.NOT_SELECTED_DATE = SOURCE.NOT_SELECTED_DATE,
TARGET.NOT_SELECTED_TIME = SOURCE.NOT_SELECTED_TIME,
TARGET.NOT_SELECTED_REASON = SOURCE.NOT_SELECTED_REASON,
TARGET.EST_DEL_DATE = SOURCE.EST_DEL_DATE,
TARGET.LAST_UPDATED = GETDATE(),
TARGET.[KEY] = SOURCE.[KEY]
WHEN NOT MATCHED BY TARGET
THEN INSERT
(
[SOURCE],
DC_ORDER_NUMBER,
DCMS_ORDER_TYPE,
CUSTOMER_PURCHASE_ORDER_ID,
BILL_TO,
CUSTOMER_MASTER_RECORD_TYPE,
SHIP_TO,
SALES_ORDER,
MERCHANDISE_STYLE,
MERCHANDISE_SIZE_1,
MATERIAL,
QUALITY,
ORDER_QTY,
ORDER_SELECTED_QTY,
ORDER_SHIPPED_QTY,
RELEASED_QTY,
PICK_QTY,
PACKED_QTY,
RELEASED_CARTONS,
FULL_CASE_PICK_COUNT,
TOTE_COUNT,
SPECIAL_PROCESS_CODE_1,
SPECIAL_PROCESS_CODE_2,
SPECIAL_PROCESS_CODE_3,
ORDER_DETAIL_STATUS,
ORDER_CARRIER,
CARRIER_SERVICE_ID,
CREATE_DATE,
CREATE_TIME,
ALLOCATION_DATE,
REQUESTED_SHIP_DATE,
CANCEL_DATE,
DISPATCH_DATE,
RELEASED_DATE,
RELEASED_TIME,
PRIORITY_ORDER,
PARTIAL_SHIP,
SHIPMENT_CARTONS,
SCANNED_CARTONS,
STAGED_CARTONS,
LOADED_CARTONS,
INVOICE_DATE,
SHIPPING_LOAD_NUMBER,
STARTING_WAVE,
ENDING_WAVE,
STAGED_DATE,
ORDER_HDR_STATUS,
DELIVERY_NUMBER,
NOT_SELECTED_DATE,
NOT_SELECTED_TIME,
NOT_SELECTED_REASON,
EST_DEL_DATE,
LAST_UPDATED,
[KEY]
)
VALUES
(
SOURCE.SOURCE,
SOURCE.DC_ORDER_NUMBER,
SOURCE.DCMS_ORDER_TYPE,
SOURCE.CUSTOMER_PURCHASE_ORDER_ID,
SOURCE.BILL_TO,
SOURCE.CUSTOMER_MASTER_RECORD_TYPE,
SOURCE.SHIP_TO,
SOURCE.SALES_ORDER,
SOURCE.MERCHANDISE_STYLE,
SOURCE.MERCHANDISE_SIZE_1,
SOURCE.MATERIAL,
SOURCE.QUALITY,
SOURCE.ORDER_QTY,
SOURCE.ORDER_SELECTED_QTY,
SOURCE.ORDER_SHIPPED_QTY,
SOURCE.RELEASED_QTY,
SOURCE.PICK_QTY,
SOURCE.PACKED_QTY,
SOURCE.RELEASED_CARTONS,
SOURCE.FULL_CASE_PICK_COUNT,
SOURCE.TOTE_COUNT,
SOURCE.SPECIAL_PROCESS_CODE_1,
SOURCE.SPECIAL_PROCESS_CODE_2,
SOURCE.SPECIAL_PROCESS_CODE_3,
SOURCE.ORDER_DETAIL_STATUS,
SOURCE.ORDER_CARRIER,
SOURCE.CARRIER_SERVICE_ID,
SOURCE.CREATE_DATE,
SOURCE.CREATE_TIME,
SOURCE.ALLOCATION_DATE,
SOURCE.REQUESTED_SHIP_DATE,
SOURCE.CANCEL_DATE,
SOURCE.DISPATCH_DATE,
SOURCE.RELEASED_DATE,
SOURCE.RELEASED_TIME,
SOURCE.PRIORITY_ORDER,
SOURCE.PARTIAL_SHIP,
SOURCE.SHIPMENT_CARTONS,
SOURCE.SCANNED_CARTONS,
SOURCE.STAGED_CARTONS,
SOURCE.LOADED_CARTONS,
SOURCE.INVOICE_DATE,
SOURCE.SHIPPING_LOAD_NUMBER,
SOURCE.STARTING_WAVE,
SOURCE.ENDING_WAVE,
SOURCE.STAGED_DATE,
SOURCE.ORDER_HDR_STATUS,
SOURCE.DELIVERY_NUMBER,
SOURCE.NOT_SELECTED_DATE,
SOURCE.NOT_SELECTED_TIME,
SOURCE.NOT_SELECTED_REASON,
SOURCE.EST_DEL_DATE,
GETDATE(),
SOURCE.[KEY]
);
END
首先,很抱歉没有使用评论,但我的声誉不够高,所以我将以这种方式回答 就所涉及的表而言,您的查询非常简单,因此没有太多的尝试(可能是开箱思考,但我现在没有任何想法) 根据计划,它显示它正在使用散列联接,目标和源的估计行数分别为1M和10K(从您的描述中我不清楚)。它还表明,大部分估计成本是由于目标表中的扫描和散列(71+15%)造成的。因此,根据目标和源中的行数,并且如果在dbo.FullOrderHeader.Key上有索引,强制循环联接可能会更好(假设估计值是准确的)。源中的行数越多,循环就越不方便 您可以通过在
之前的MERGE
语句末尾添加选项(循环连接)
来实现这一点代码>
如果源的数量
CREATE PROCEDURE dbo.spINSERT_FULL_ORDERHEADER
AS
BEGIN
WITH ORDER_DETAIL_V2
AS (
SELECT 'DCMS' AS SOURCE
,DC_ORDER_NUMBER
,DCMS_ORDER_TYPE
,CUSTOMER_PURCHASE_ORDER_ID
,BILL_TO
,CUSTOMER_MASTER_RECORD_TYPE
,SHIP_TO
,SALES_ORDER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CONCAT (
SUBSTRING(MERCHANDISE_STYLE, 3, 6)
,'-'
,SUBSTRING(MERCHANDISE_STYLE, 9, 3)
) AS MATERIAL
,SUBSTRING(MERCHANDISE_STYLE, 14, 2) AS QUALITY
,ORDER_QTY
,ORDER_SELECTED_QTY
,ORDER_SHIPPED_QTY
,RELEASED_QTY
,PICK_QTY
,PACKED_QTY
,RELEASED_CARTONS
,FULL_CASE_PICK_COUNT
,TOTE_COUNT
,SPECIAL_PROCESS_CODE_1
,SPECIAL_PROCESS_CODE_2
,SPECIAL_PROCESS_CODE_3
,ORDER_DETAIL_STATUS
,ORDER_CARRIER
,CARRIER_SERVICE_ID
,CAST(CONVERT(VARCHAR, CREATE_DATE) AS DATE) AS CREATE_DATE
,LEFT(cast(dateadd(hh, 2, LEFT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 8), 2)) AS TIME), 8) AS CREATE_TIME
,CAST(CONVERT(VARCHAR, ALLOCATION_DATE) AS DATE) AS ALLOCATION_DATE
,CAST(CONVERT(VARCHAR, REQUESTED_SHIP_DATE) AS DATE) AS REQUESTED_SHIP_DATE
,CAST(CONVERT(VARCHAR, CANCEL_DATE) AS DATE) AS CANCEL_DATE
,CASE
WHEN DISPATCH_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, DISPATCH_DATE) AS DATE)
END AS DISPATCH_DATE
,CASE
WHEN RELEASED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, RELEASED_DATE) AS DATE)
END AS RELEASED_DATE
,LEFT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2) AS RELEASED_TIME
,PRIORITY_ORDER
,PARTIAL_SHIP
,SHIPMENT_CARTONS
,SCANNED_CARTONS
,STAGED_CARTONS
,LOADED_CARTONS
,CASE
WHEN INVOICE_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, INVOICE_DATE) AS DATE)
END AS INVOICE_DATE
,SHIPPING_LOAD_NUMBER
,STARTING_WAVE
,ENDING_WAVE
,CASE
WHEN STAGED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, STAGED_DATE) AS DATE)
END AS STAGED_DATE
,ORDER_HDR_STATUS
,LEFT(HOST_ORDER_NUMBER, 9) AS DELIVERY_NUMBER
,CASE
WHEN NOT_SELECTED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, NOT_SELECTED_DATE) AS DATE)
END AS NOT_SELECTED_DATE
,LEFT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2) AS NOT_SELECTED_TIME
,NOT_SELECTED_REASON
,CAST(CONVERT(VARCHAR, EST_DEL_DT) AS DATE) AS EST_DEL_DATE
,CONCAT (
DC_ORDER_NUMBER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CREATE_DATE
) AS [KEY]
FROM OPENQUERY(MEMDWPR1,
'
SELECT
OHORNO AS DC_ORDER_NUMBER,
OHORTY AS DCMS_ORDER_TYPE,
OHCUPO AS CUSTOMER_PURCHASE_ORDER_ID,
OHBLTO AS BILL_TO,
OHCURT AS CUSTOMER_MASTER_RECORD_TYPE,
OHSHTO AS SHIP_TO,
OHSAOR AS SALES_ORDER,
ODMRSY AS MERCHANDISE_STYLE,
ODMRS1 AS MERCHANDISE_SIZE_1,
ODORQT AS ORDER_QTY,
ODORSL AS ORDER_SELECTED_QTY,
ODORSH AS ORDER_SHIPPED_QTY,
OHRLQT AS RELEASED_QTY,
OHPKQT AS PICK_QTY,
OHPDQT AS PACKED_QTY,
OHRLCA AS RELEASED_CARTONS,
OHFCCT AS FULL_CASE_PICK_COUNT,
OHTOCT AS TOTE_COUNT,
ODSP01 AS SPECIAL_PROCESS_CODE_1,
ODSP02 AS SPECIAL_PROCESS_CODE_2,
ODSP03 AS SPECIAL_PROCESS_CODE_3,
ODODST AS ORDER_DETAIL_STATUS,
OHORCR AS ORDER_CARRIER,
OHCRSV AS CARRIER_SERVICE_ID,
OHCRDT AS CREATE_DATE,
OHCRTM AS CREATE_TIME,
OHALDT AS ALLOCATION_DATE,
OHRQDT AS REQUESTED_SHIP_DATE,
OHCNDT AS CANCEL_DATE,
OHDIDT AS DISPATCH_DATE,
OHRLDT AS RELEASED_DATE,
OHRLTM AS RELEASED_TIME,
OHORPY AS PRIORITY_ORDER,
OHPLSH AS PARTIAL_SHIP,
OHSHCA AS SHIPMENT_CARTONS,
OHSNCA AS SCANNED_CARTONS,
OHSGCA AS STAGED_CARTONS,
OHLDCA AS LOADED_CARTONS,
OHIVDT AS INVOICE_DATE,
OHLDNO AS SHIPPING_LOAD_NUMBER,
OHWVST AS STARTING_WAVE,
OHWVED AS ENDING_WAVE,
OHSGDT AS STAGED_DATE,
OHOHST AS ORDER_HDR_STATUS,
OHHSOR AS HOST_ORDER_NUMBER,
OHSLDT AS NOT_SELECTED_DATE,
OHSLTM AS NOT_SELECTED_TIME,
OHSLRS AS NOT_SELECTED_REASON,
OHEXDD AS EST_DEL_DT
FROM DSV052BDTA.OHORDR00@MEMWMS2.WORLD
JOIN DSV052BDTA.ODORDR00@MEMWMS2.WORLD
ON ODORNO = OHORNO
'
)
GROUP BY DC_ORDER_NUMBER
,DCMS_ORDER_TYPE
,CUSTOMER_PURCHASE_ORDER_ID
,BILL_TO
,CUSTOMER_MASTER_RECORD_TYPE
,SHIP_TO
,SALES_ORDER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CONCAT (
SUBSTRING(MERCHANDISE_STYLE, 3, 6)
,'-'
,SUBSTRING(MERCHANDISE_STYLE, 9, 3)
)
,SUBSTRING(MERCHANDISE_STYLE, 14, 2)
,ORDER_QTY
,ORDER_SELECTED_QTY
,ORDER_SHIPPED_QTY
,RELEASED_QTY
,PICK_QTY
,PACKED_QTY
,RELEASED_CARTONS
,FULL_CASE_PICK_COUNT
,TOTE_COUNT
,SPECIAL_PROCESS_CODE_1
,SPECIAL_PROCESS_CODE_2
,SPECIAL_PROCESS_CODE_3
,ORDER_DETAIL_STATUS
,ORDER_CARRIER
,CARRIER_SERVICE_ID
,CAST(CONVERT(VARCHAR, CREATE_DATE) AS DATE)
,LEFT(cast(dateadd(hh, 2, LEFT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 8), 2)) AS TIME), 8)
,CAST(CONVERT(VARCHAR, ALLOCATION_DATE) AS DATE)
,CAST(CONVERT(VARCHAR, REQUESTED_SHIP_DATE) AS DATE)
,CAST(CONVERT(VARCHAR, CANCEL_DATE) AS DATE)
,CASE
WHEN DISPATCH_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, DISPATCH_DATE) AS DATE)
END
,CASE
WHEN RELEASED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, RELEASED_DATE) AS DATE)
END
,LEFT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2)
,PRIORITY_ORDER
,PARTIAL_SHIP
,SHIPMENT_CARTONS
,SCANNED_CARTONS
,STAGED_CARTONS
,LOADED_CARTONS
,CASE
WHEN INVOICE_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, INVOICE_DATE) AS DATE)
END
,SHIPPING_LOAD_NUMBER
,STARTING_WAVE
,ENDING_WAVE
,CASE
WHEN STAGED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, STAGED_DATE) AS DATE)
END
,ORDER_HDR_STATUS
,LEFT(HOST_ORDER_NUMBER, 9)
,CASE
WHEN NOT_SELECTED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, NOT_SELECTED_DATE) AS DATE)
END
,LEFT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2)
,NOT_SELECTED_REASON
,CAST(CONVERT(VARCHAR, EST_DEL_DT) AS DATE)
,CONCAT (
DC_ORDER_NUMBER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CREATE_DATE
)
)
MERGE BUSINESSPLANNING_TEST.dbo.[FullOrderHeader] AS TARGET
USING ORDER_DETAIL_V2 AS SOURCE
ON TARGET.[KEY] = SOURCE.[KEY]
WHEN MATCHED
THEN
UPDATE
SET TARGET.[SOURCE] = SOURCE.[SOURCE]
,TARGET.DC_ORDER_NUMBER = SOURCE.DC_ORDER_NUMBER
,TARGET.DCMS_ORDER_TYPE = SOURCE.DCMS_ORDER_TYPE
,TARGET.CUSTOMER_PURCHASE_ORDER_ID = SOURCE.CUSTOMER_PURCHASE_ORDER_ID
,TARGET.BILL_TO = SOURCE.BILL_TO
,TARGET.CUSTOMER_MASTER_RECORD_TYPE = SOURCE.CUSTOMER_MASTER_RECORD_TYPE
,TARGET.SHIP_TO = SOURCE.SHIP_TO
,TARGET.SALES_ORDER = SOURCE.SALES_ORDER
,TARGET.MERCHANDISE_STYLE = SOURCE.MERCHANDISE_STYLE
,TARGET.MERCHANDISE_SIZE_1 = SOURCE.MERCHANDISE_SIZE_1
,TARGET.MATERIAL = SOURCE.MATERIAL
,TARGET.QUALITY = SOURCE.QUALITY
,TARGET.ORDER_QTY = SOURCE.ORDER_QTY
,TARGET.ORDER_SELECTED_QTY = SOURCE.ORDER_SELECTED_QTY
,TARGET.ORDER_SHIPPED_QTY = SOURCE.ORDER_SHIPPED_QTY
,TARGET.RELEASED_QTY = SOURCE.RELEASED_QTY
,TARGET.PICK_QTY = SOURCE.PICK_QTY
,TARGET.PACKED_QTY = SOURCE.PACKED_QTY
,TARGET.RELEASED_CARTONS = SOURCE.RELEASED_CARTONS
,TARGET.FULL_CASE_PICK_COUNT = SOURCE.FULL_CASE_PICK_COUNT
,TARGET.TOTE_COUNT = SOURCE.TOTE_COUNT
,TARGET.SPECIAL_PROCESS_CODE_1 = SOURCE.SPECIAL_PROCESS_CODE_1
,TARGET.SPECIAL_PROCESS_CODE_2 = SOURCE.SPECIAL_PROCESS_CODE_2
,TARGET.SPECIAL_PROCESS_CODE_3 = SOURCE.SPECIAL_PROCESS_CODE_3
,TARGET.ORDER_DETAIL_STATUS = SOURCE.ORDER_DETAIL_STATUS
,TARGET.ORDER_CARRIER = SOURCE.ORDER_CARRIER
,TARGET.CARRIER_SERVICE_ID = SOURCE.CARRIER_SERVICE_ID
,TARGET.CREATE_DATE = SOURCE.CREATE_DATE
,TARGET.CREATE_TIME = SOURCE.CREATE_TIME
,TARGET.ALLOCATION_DATE = SOURCE.ALLOCATION_DATE
,TARGET.REQUESTED_SHIP_DATE = SOURCE.REQUESTED_SHIP_DATE
,TARGET.CANCEL_DATE = SOURCE.CANCEL_DATE
,TARGET.DISPATCH_DATE = SOURCE.DISPATCH_DATE
,TARGET.RELEASED_DATE = SOURCE.RELEASED_DATE
,TARGET.RELEASED_TIME = SOURCE.RELEASED_TIME
,TARGET.PRIORITY_ORDER = SOURCE.PRIORITY_ORDER
,TARGET.PARTIAL_SHIP = SOURCE.PARTIAL_SHIP
,TARGET.SHIPMENT_CARTONS = SOURCE.SHIPMENT_CARTONS
,TARGET.SCANNED_CARTONS = SOURCE.SCANNED_CARTONS
,TARGET.STAGED_CARTONS = SOURCE.STAGED_CARTONS
,TARGET.LOADED_CARTONS = SOURCE.LOADED_CARTONS
,TARGET.INVOICE_DATE = SOURCE.INVOICE_DATE
,TARGET.SHIPPING_LOAD_NUMBER = SOURCE.SHIPPING_LOAD_NUMBER
,TARGET.STARTING_WAVE = SOURCE.STARTING_WAVE
,TARGET.ENDING_WAVE = SOURCE.ENDING_WAVE
,TARGET.STAGED_DATE = SOURCE.STAGED_DATE
,TARGET.ORDER_HDR_STATUS = SOURCE.ORDER_HDR_STATUS
,TARGET.DELIVERY_NUMBER = SOURCE.DELIVERY_NUMBER
,TARGET.NOT_SELECTED_DATE = SOURCE.NOT_SELECTED_DATE
,TARGET.NOT_SELECTED_TIME = SOURCE.NOT_SELECTED_TIME
,TARGET.NOT_SELECTED_REASON = SOURCE.NOT_SELECTED_REASON
,TARGET.EST_DEL_DATE = SOURCE.EST_DEL_DATE
,TARGET.LAST_UPDATED = GETDATE()
,TARGET.[KEY] = SOURCE.[KEY]
WHEN NOT MATCHED BY TARGET
THEN
INSERT (
[SOURCE]
,DC_ORDER_NUMBER
,DCMS_ORDER_TYPE
,CUSTOMER_PURCHASE_ORDER_ID
,BILL_TO
,CUSTOMER_MASTER_RECORD_TYPE
,SHIP_TO
,SALES_ORDER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,MATERIAL
,QUALITY
,ORDER_QTY
,ORDER_SELECTED_QTY
,ORDER_SHIPPED_QTY
,RELEASED_QTY
,PICK_QTY
,PACKED_QTY
,RELEASED_CARTONS
,FULL_CASE_PICK_COUNT
,TOTE_COUNT
,SPECIAL_PROCESS_CODE_1
,SPECIAL_PROCESS_CODE_2
,SPECIAL_PROCESS_CODE_3
,ORDER_DETAIL_STATUS
,ORDER_CARRIER
,CARRIER_SERVICE_ID
,CREATE_DATE
,CREATE_TIME
,ALLOCATION_DATE
,REQUESTED_SHIP_DATE
,CANCEL_DATE
,DISPATCH_DATE
,RELEASED_DATE
,RELEASED_TIME
,PRIORITY_ORDER
,PARTIAL_SHIP
,SHIPMENT_CARTONS
,SCANNED_CARTONS
,STAGED_CARTONS
,LOADED_CARTONS
,INVOICE_DATE
,SHIPPING_LOAD_NUMBER
,STARTING_WAVE
,ENDING_WAVE
,STAGED_DATE
,ORDER_HDR_STATUS
,DELIVERY_NUMBER
,NOT_SELECTED_DATE
,NOT_SELECTED_TIME
,NOT_SELECTED_REASON
,EST_DEL_DATE
,LAST_UPDATED
,[KEY]
)
VALUES (
SOURCE.SOURCE
,SOURCE.DC_ORDER_NUMBER
,SOURCE.DCMS_ORDER_TYPE
,SOURCE.CUSTOMER_PURCHASE_ORDER_ID
,SOURCE.BILL_TO
,SOURCE.CUSTOMER_MASTER_RECORD_TYPE
,SOURCE.SHIP_TO
,SOURCE.SALES_ORDER
,SOURCE.MERCHANDISE_STYLE
,SOURCE.MERCHANDISE_SIZE_1
,SOURCE.MATERIAL
,SOURCE.QUALITY
,SOURCE.ORDER_QTY
,SOURCE.ORDER_SELECTED_QTY
,SOURCE.ORDER_SHIPPED_QTY
,SOURCE.RELEASED_QTY
,SOURCE.PICK_QTY
,SOURCE.PACKED_QTY
,SOURCE.RELEASED_CARTONS
,SOURCE.FULL_CASE_PICK_COUNT
,SOURCE.TOTE_COUNT
,SOURCE.SPECIAL_PROCESS_CODE_1
,SOURCE.SPECIAL_PROCESS_CODE_2
,SOURCE.SPECIAL_PROCESS_CODE_3
,SOURCE.ORDER_DETAIL_STATUS
,SOURCE.ORDER_CARRIER
,SOURCE.CARRIER_SERVICE_ID
,SOURCE.CREATE_DATE
,SOURCE.CREATE_TIME
,SOURCE.ALLOCATION_DATE
,SOURCE.REQUESTED_SHIP_DATE
,SOURCE.CANCEL_DATE
,SOURCE.DISPATCH_DATE
,SOURCE.RELEASED_DATE
,SOURCE.RELEASED_TIME
,SOURCE.PRIORITY_ORDER
,SOURCE.PARTIAL_SHIP
,SOURCE.SHIPMENT_CARTONS
,SOURCE.SCANNED_CARTONS
,SOURCE.STAGED_CARTONS
,SOURCE.LOADED_CARTONS
,SOURCE.INVOICE_DATE
,SOURCE.SHIPPING_LOAD_NUMBER
,SOURCE.STARTING_WAVE
,SOURCE.ENDING_WAVE
,SOURCE.STAGED_DATE
,SOURCE.ORDER_HDR_STATUS
,SOURCE.DELIVERY_NUMBER
,SOURCE.NOT_SELECTED_DATE
,SOURCE.NOT_SELECTED_TIME
,SOURCE.NOT_SELECTED_REASON
,SOURCE.EST_DEL_DATE
,GETDATE()
,SOURCE.[KEY]
) OPTION (LOOP JOIN);
END
首先,很抱歉没有使用评论,但我的声誉不够高,所以我将以这种方式回答
就所涉及的表而言,您的查询非常简单,因此没有太多的尝试(可能是开箱思考,但我现在没有任何想法)
根据计划,它显示它正在使用散列联接,目标和源的估计行数分别为1M和10K(从您的描述中我不清楚)。它还表明,大部分估计成本是由于目标表中的扫描和散列(71+15%)造成的。因此,根据目标和源中的行数,并且如果在dbo.FullOrderHeader.Key上有索引,强制循环联接可能会更好(假设估计值是准确的)。源中的行数越多,循环就越不方便
您可以通过在之前的MERGE
语句末尾添加选项(循环连接)
来实现这一点代码>
如果源的数量
CREATE PROCEDURE dbo.spINSERT_FULL_ORDERHEADER
AS
BEGIN
WITH ORDER_DETAIL_V2
AS (
SELECT 'DCMS' AS SOURCE
,DC_ORDER_NUMBER
,DCMS_ORDER_TYPE
,CUSTOMER_PURCHASE_ORDER_ID
,BILL_TO
,CUSTOMER_MASTER_RECORD_TYPE
,SHIP_TO
,SALES_ORDER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CONCAT (
SUBSTRING(MERCHANDISE_STYLE, 3, 6)
,'-'
,SUBSTRING(MERCHANDISE_STYLE, 9, 3)
) AS MATERIAL
,SUBSTRING(MERCHANDISE_STYLE, 14, 2) AS QUALITY
,ORDER_QTY
,ORDER_SELECTED_QTY
,ORDER_SHIPPED_QTY
,RELEASED_QTY
,PICK_QTY
,PACKED_QTY
,RELEASED_CARTONS
,FULL_CASE_PICK_COUNT
,TOTE_COUNT
,SPECIAL_PROCESS_CODE_1
,SPECIAL_PROCESS_CODE_2
,SPECIAL_PROCESS_CODE_3
,ORDER_DETAIL_STATUS
,ORDER_CARRIER
,CARRIER_SERVICE_ID
,CAST(CONVERT(VARCHAR, CREATE_DATE) AS DATE) AS CREATE_DATE
,LEFT(cast(dateadd(hh, 2, LEFT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 8), 2)) AS TIME), 8) AS CREATE_TIME
,CAST(CONVERT(VARCHAR, ALLOCATION_DATE) AS DATE) AS ALLOCATION_DATE
,CAST(CONVERT(VARCHAR, REQUESTED_SHIP_DATE) AS DATE) AS REQUESTED_SHIP_DATE
,CAST(CONVERT(VARCHAR, CANCEL_DATE) AS DATE) AS CANCEL_DATE
,CASE
WHEN DISPATCH_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, DISPATCH_DATE) AS DATE)
END AS DISPATCH_DATE
,CASE
WHEN RELEASED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, RELEASED_DATE) AS DATE)
END AS RELEASED_DATE
,LEFT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2) AS RELEASED_TIME
,PRIORITY_ORDER
,PARTIAL_SHIP
,SHIPMENT_CARTONS
,SCANNED_CARTONS
,STAGED_CARTONS
,LOADED_CARTONS
,CASE
WHEN INVOICE_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, INVOICE_DATE) AS DATE)
END AS INVOICE_DATE
,SHIPPING_LOAD_NUMBER
,STARTING_WAVE
,ENDING_WAVE
,CASE
WHEN STAGED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, STAGED_DATE) AS DATE)
END AS STAGED_DATE
,ORDER_HDR_STATUS
,LEFT(HOST_ORDER_NUMBER, 9) AS DELIVERY_NUMBER
,CASE
WHEN NOT_SELECTED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, NOT_SELECTED_DATE) AS DATE)
END AS NOT_SELECTED_DATE
,LEFT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2) AS NOT_SELECTED_TIME
,NOT_SELECTED_REASON
,CAST(CONVERT(VARCHAR, EST_DEL_DT) AS DATE) AS EST_DEL_DATE
,CONCAT (
DC_ORDER_NUMBER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CREATE_DATE
) AS [KEY]
FROM OPENQUERY(MEMDWPR1,
'
SELECT
OHORNO AS DC_ORDER_NUMBER,
OHORTY AS DCMS_ORDER_TYPE,
OHCUPO AS CUSTOMER_PURCHASE_ORDER_ID,
OHBLTO AS BILL_TO,
OHCURT AS CUSTOMER_MASTER_RECORD_TYPE,
OHSHTO AS SHIP_TO,
OHSAOR AS SALES_ORDER,
ODMRSY AS MERCHANDISE_STYLE,
ODMRS1 AS MERCHANDISE_SIZE_1,
ODORQT AS ORDER_QTY,
ODORSL AS ORDER_SELECTED_QTY,
ODORSH AS ORDER_SHIPPED_QTY,
OHRLQT AS RELEASED_QTY,
OHPKQT AS PICK_QTY,
OHPDQT AS PACKED_QTY,
OHRLCA AS RELEASED_CARTONS,
OHFCCT AS FULL_CASE_PICK_COUNT,
OHTOCT AS TOTE_COUNT,
ODSP01 AS SPECIAL_PROCESS_CODE_1,
ODSP02 AS SPECIAL_PROCESS_CODE_2,
ODSP03 AS SPECIAL_PROCESS_CODE_3,
ODODST AS ORDER_DETAIL_STATUS,
OHORCR AS ORDER_CARRIER,
OHCRSV AS CARRIER_SERVICE_ID,
OHCRDT AS CREATE_DATE,
OHCRTM AS CREATE_TIME,
OHALDT AS ALLOCATION_DATE,
OHRQDT AS REQUESTED_SHIP_DATE,
OHCNDT AS CANCEL_DATE,
OHDIDT AS DISPATCH_DATE,
OHRLDT AS RELEASED_DATE,
OHRLTM AS RELEASED_TIME,
OHORPY AS PRIORITY_ORDER,
OHPLSH AS PARTIAL_SHIP,
OHSHCA AS SHIPMENT_CARTONS,
OHSNCA AS SCANNED_CARTONS,
OHSGCA AS STAGED_CARTONS,
OHLDCA AS LOADED_CARTONS,
OHIVDT AS INVOICE_DATE,
OHLDNO AS SHIPPING_LOAD_NUMBER,
OHWVST AS STARTING_WAVE,
OHWVED AS ENDING_WAVE,
OHSGDT AS STAGED_DATE,
OHOHST AS ORDER_HDR_STATUS,
OHHSOR AS HOST_ORDER_NUMBER,
OHSLDT AS NOT_SELECTED_DATE,
OHSLTM AS NOT_SELECTED_TIME,
OHSLRS AS NOT_SELECTED_REASON,
OHEXDD AS EST_DEL_DT
FROM DSV052BDTA.OHORDR00@MEMWMS2.WORLD
JOIN DSV052BDTA.ODORDR00@MEMWMS2.WORLD
ON ODORNO = OHORNO
'
)
GROUP BY DC_ORDER_NUMBER
,DCMS_ORDER_TYPE
,CUSTOMER_PURCHASE_ORDER_ID
,BILL_TO
,CUSTOMER_MASTER_RECORD_TYPE
,SHIP_TO
,SALES_ORDER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CONCAT (
SUBSTRING(MERCHANDISE_STYLE, 3, 6)
,'-'
,SUBSTRING(MERCHANDISE_STYLE, 9, 3)
)
,SUBSTRING(MERCHANDISE_STYLE, 14, 2)
,ORDER_QTY
,ORDER_SELECTED_QTY
,ORDER_SHIPPED_QTY
,RELEASED_QTY
,PICK_QTY
,PACKED_QTY
,RELEASED_CARTONS
,FULL_CASE_PICK_COUNT
,TOTE_COUNT
,SPECIAL_PROCESS_CODE_1
,SPECIAL_PROCESS_CODE_2
,SPECIAL_PROCESS_CODE_3
,ORDER_DETAIL_STATUS
,ORDER_CARRIER
,CARRIER_SERVICE_ID
,CAST(CONVERT(VARCHAR, CREATE_DATE) AS DATE)
,LEFT(cast(dateadd(hh, 2, LEFT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,CREATE_TIME
), 8), 2)) AS TIME), 8)
,CAST(CONVERT(VARCHAR, ALLOCATION_DATE) AS DATE)
,CAST(CONVERT(VARCHAR, REQUESTED_SHIP_DATE) AS DATE)
,CAST(CONVERT(VARCHAR, CANCEL_DATE) AS DATE)
,CASE
WHEN DISPATCH_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, DISPATCH_DATE) AS DATE)
END
,CASE
WHEN RELEASED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, RELEASED_DATE) AS DATE)
END
,LEFT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,RELEASED_TIME
), 6), 2)
,PRIORITY_ORDER
,PARTIAL_SHIP
,SHIPMENT_CARTONS
,SCANNED_CARTONS
,STAGED_CARTONS
,LOADED_CARTONS
,CASE
WHEN INVOICE_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, INVOICE_DATE) AS DATE)
END
,SHIPPING_LOAD_NUMBER
,STARTING_WAVE
,ENDING_WAVE
,CASE
WHEN STAGED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, STAGED_DATE) AS DATE)
END
,ORDER_HDR_STATUS
,LEFT(HOST_ORDER_NUMBER, 9)
,CASE
WHEN NOT_SELECTED_DATE = 0
THEN NULL
ELSE CAST(CONVERT(VARCHAR, NOT_SELECTED_DATE) AS DATE)
END
,LEFT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2) + ':' + SUBSTRING(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 3, 2) + ':' + RIGHT(RIGHT(CONCAT (
'000000'
,NOT_SELECTED_TIME
), 6), 2)
,NOT_SELECTED_REASON
,CAST(CONVERT(VARCHAR, EST_DEL_DT) AS DATE)
,CONCAT (
DC_ORDER_NUMBER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,CREATE_DATE
)
)
MERGE BUSINESSPLANNING_TEST.dbo.[FullOrderHeader] AS TARGET
USING ORDER_DETAIL_V2 AS SOURCE
ON TARGET.[KEY] = SOURCE.[KEY]
WHEN MATCHED
THEN
UPDATE
SET TARGET.[SOURCE] = SOURCE.[SOURCE]
,TARGET.DC_ORDER_NUMBER = SOURCE.DC_ORDER_NUMBER
,TARGET.DCMS_ORDER_TYPE = SOURCE.DCMS_ORDER_TYPE
,TARGET.CUSTOMER_PURCHASE_ORDER_ID = SOURCE.CUSTOMER_PURCHASE_ORDER_ID
,TARGET.BILL_TO = SOURCE.BILL_TO
,TARGET.CUSTOMER_MASTER_RECORD_TYPE = SOURCE.CUSTOMER_MASTER_RECORD_TYPE
,TARGET.SHIP_TO = SOURCE.SHIP_TO
,TARGET.SALES_ORDER = SOURCE.SALES_ORDER
,TARGET.MERCHANDISE_STYLE = SOURCE.MERCHANDISE_STYLE
,TARGET.MERCHANDISE_SIZE_1 = SOURCE.MERCHANDISE_SIZE_1
,TARGET.MATERIAL = SOURCE.MATERIAL
,TARGET.QUALITY = SOURCE.QUALITY
,TARGET.ORDER_QTY = SOURCE.ORDER_QTY
,TARGET.ORDER_SELECTED_QTY = SOURCE.ORDER_SELECTED_QTY
,TARGET.ORDER_SHIPPED_QTY = SOURCE.ORDER_SHIPPED_QTY
,TARGET.RELEASED_QTY = SOURCE.RELEASED_QTY
,TARGET.PICK_QTY = SOURCE.PICK_QTY
,TARGET.PACKED_QTY = SOURCE.PACKED_QTY
,TARGET.RELEASED_CARTONS = SOURCE.RELEASED_CARTONS
,TARGET.FULL_CASE_PICK_COUNT = SOURCE.FULL_CASE_PICK_COUNT
,TARGET.TOTE_COUNT = SOURCE.TOTE_COUNT
,TARGET.SPECIAL_PROCESS_CODE_1 = SOURCE.SPECIAL_PROCESS_CODE_1
,TARGET.SPECIAL_PROCESS_CODE_2 = SOURCE.SPECIAL_PROCESS_CODE_2
,TARGET.SPECIAL_PROCESS_CODE_3 = SOURCE.SPECIAL_PROCESS_CODE_3
,TARGET.ORDER_DETAIL_STATUS = SOURCE.ORDER_DETAIL_STATUS
,TARGET.ORDER_CARRIER = SOURCE.ORDER_CARRIER
,TARGET.CARRIER_SERVICE_ID = SOURCE.CARRIER_SERVICE_ID
,TARGET.CREATE_DATE = SOURCE.CREATE_DATE
,TARGET.CREATE_TIME = SOURCE.CREATE_TIME
,TARGET.ALLOCATION_DATE = SOURCE.ALLOCATION_DATE
,TARGET.REQUESTED_SHIP_DATE = SOURCE.REQUESTED_SHIP_DATE
,TARGET.CANCEL_DATE = SOURCE.CANCEL_DATE
,TARGET.DISPATCH_DATE = SOURCE.DISPATCH_DATE
,TARGET.RELEASED_DATE = SOURCE.RELEASED_DATE
,TARGET.RELEASED_TIME = SOURCE.RELEASED_TIME
,TARGET.PRIORITY_ORDER = SOURCE.PRIORITY_ORDER
,TARGET.PARTIAL_SHIP = SOURCE.PARTIAL_SHIP
,TARGET.SHIPMENT_CARTONS = SOURCE.SHIPMENT_CARTONS
,TARGET.SCANNED_CARTONS = SOURCE.SCANNED_CARTONS
,TARGET.STAGED_CARTONS = SOURCE.STAGED_CARTONS
,TARGET.LOADED_CARTONS = SOURCE.LOADED_CARTONS
,TARGET.INVOICE_DATE = SOURCE.INVOICE_DATE
,TARGET.SHIPPING_LOAD_NUMBER = SOURCE.SHIPPING_LOAD_NUMBER
,TARGET.STARTING_WAVE = SOURCE.STARTING_WAVE
,TARGET.ENDING_WAVE = SOURCE.ENDING_WAVE
,TARGET.STAGED_DATE = SOURCE.STAGED_DATE
,TARGET.ORDER_HDR_STATUS = SOURCE.ORDER_HDR_STATUS
,TARGET.DELIVERY_NUMBER = SOURCE.DELIVERY_NUMBER
,TARGET.NOT_SELECTED_DATE = SOURCE.NOT_SELECTED_DATE
,TARGET.NOT_SELECTED_TIME = SOURCE.NOT_SELECTED_TIME
,TARGET.NOT_SELECTED_REASON = SOURCE.NOT_SELECTED_REASON
,TARGET.EST_DEL_DATE = SOURCE.EST_DEL_DATE
,TARGET.LAST_UPDATED = GETDATE()
,TARGET.[KEY] = SOURCE.[KEY]
WHEN NOT MATCHED BY TARGET
THEN
INSERT (
[SOURCE]
,DC_ORDER_NUMBER
,DCMS_ORDER_TYPE
,CUSTOMER_PURCHASE_ORDER_ID
,BILL_TO
,CUSTOMER_MASTER_RECORD_TYPE
,SHIP_TO
,SALES_ORDER
,MERCHANDISE_STYLE
,MERCHANDISE_SIZE_1
,MATERIAL
,QUALITY
,ORDER_QTY
,ORDER_SELECTED_QTY
,ORDER_SHIPPED_QTY
,RELEASED_QTY
,PICK_QTY
,PACKED_QTY
,RELEASED_CARTONS
,FULL_CASE_PICK_COUNT
,TOTE_COUNT
,SPECIAL_PROCESS_CODE_1
,SPECIAL_PROCESS_CODE_2
,SPECIAL_PROCESS_CODE_3
,ORDER_DETAIL_STATUS
,ORDER_CARRIER
,CARRIER_SERVICE_ID
,CREATE_DATE
,CREATE_TIME
,ALLOCATION_DATE
,REQUESTED_SHIP_DATE
,CANCEL_DATE
,DISPATCH_DATE
,RELEASED_DATE
,RELEASED_TIME
,PRIORITY_ORDER
,PARTIAL_SHIP
,SHIPMENT_CARTONS
,SCANNED_CARTONS
,STAGED_CARTONS
,LOADED_CARTONS
,INVOICE_DATE
,SHIPPING_LOAD_NUMBER
,STARTING_WAVE
,ENDING_WAVE
,STAGED_DATE
,ORDER_HDR_STATUS
,DELIVERY_NUMBER
,NOT_SELECTED_DATE
,NOT_SELECTED_TIME
,NOT_SELECTED_REASON
,EST_DEL_DATE
,LAST_UPDATED
,[KEY]
)
VALUES (
SOURCE.SOURCE
,SOURCE.DC_ORDER_NUMBER
,SOURCE.DCMS_ORDER_TYPE
,SOURCE.CUSTOMER_PURCHASE_ORDER_ID
,SOURCE.BILL_TO
,SOURCE.CUSTOMER_MASTER_RECORD_TYPE
,SOURCE.SHIP_TO
,SOURCE.SALES_ORDER
,SOURCE.MERCHANDISE_STYLE
,SOURCE.MERCHANDISE_SIZE_1
,SOURCE.MATERIAL
,SOURCE.QUALITY
,SOURCE.ORDER_QTY
,SOURCE.ORDER_SELECTED_QTY
,SOURCE.ORDER_SHIPPED_QTY
,SOURCE.RELEASED_QTY
,SOURCE.PICK_QTY
,SOURCE.PACKED_QTY
,SOURCE.RELEASED_CARTONS
,SOURCE.FULL_CASE_PICK_COUNT
,SOURCE.TOTE_COUNT
,SOURCE.SPECIAL_PROCESS_CODE_1
,SOURCE.SPECIAL_PROCESS_CODE_2
,SOURCE.SPECIAL_PROCESS_CODE_3
,SOURCE.ORDER_DETAIL_STATUS
,SOURCE.ORDER_CARRIER
,SOURCE.CARRIER_SERVICE_ID
,SOURCE.CREATE_DATE
,SOURCE.CREATE_TIME
,SOURCE.ALLOCATION_DATE
,SOURCE.REQUESTED_SHIP_DATE
,SOURCE.CANCEL_DATE
,SOURCE.DISPATCH_DATE
,SOURCE.RELEASED_DATE
,SOURCE.RELEASED_TIME
,SOURCE.PRIORITY_ORDER
,SOURCE.PARTIAL_SHIP
,SOURCE.SHIPMENT_CARTONS
,SOURCE.SCANNED_CARTONS
,SOURCE.STAGED_CARTONS
,SOURCE.LOADED_CARTONS
,SOURCE.INVOICE_DATE
,SOURCE.SHIPPING_LOAD_NUMBER
,SOURCE.STARTING_WAVE
,SOURCE.ENDING_WAVE
,SOURCE.STAGED_DATE
,SOURCE.ORDER_HDR_STATUS
,SOURCE.DELIVERY_NUMBER
,SOURCE.NOT_SELECTED_DATE
,SOURCE.NOT_SELECTED_TIME
,SOURCE.NOT_SELECTED_REASON
,SOURCE.EST_DEL_DATE
,GETDATE()
,SOURCE.[KEY]
) OPTION (LOOP JOIN);
END
这是链接:好的,我已经添加了执行计划的链接。谢谢你!71%的成本是对FullOrderHeader的表扫描,这意味着,除非您的查询需要所有索引,否则索引是有序的。您应该尝试将远程表本地复制到tempdb中,而不是使用cte。我想你的主桌可以用columnstore作为well@DaleK谢谢你的主意。我减少了UPDATE语句中的列数,我意识到其中至少有一半没有得到更新,所以我把它们去掉了。我的查询时间减少了5分钟!!差别很大。谢谢你的想法这是链接:好的,我已经把链接添加到执行计划中了。谢谢你!71%的成本是对FullOrderHeader的表扫描,这意味着,除非您的查询需要所有索引,否则索引是有序的。您应该尝试将远程表本地复制到tempdb中,而不是使用cte。我想你的主桌可以用columnstore作为well@DaleK谢谢你的主意。我减少了UPDATE语句中的列数,我意识到其中至少有一半没有得到更新,所以我把它们去掉了。我的查询时间减少了5分钟!!差别很大。谢谢你的想法我试过了,它实际上让事情变得更糟了。30多分钟后,虽然MERGE下降了2%至69%,但仍在运行。为了提高性能,我做了大约一半的UPDATE语句列,这将性能提高了5分钟(最初是16分钟)。是的,如果假设无效,可能会在BUSINESSPLANNING_TEST.dbo。[FullOrderHeader]。键上建立索引,并在源代码中保留少量行。你能确认一下吗?你能列出目标表的所有索引吗?我试过了,它实际上让情况变得更糟。30多分钟后,虽然MERGE下降了2%至69%,但仍在运行。为了提高性能,我做了大约一半的UPDATE语句列,这将性能提高了5分钟(最初是16分钟)。是的,如果假设无效,可能会在BUSINESSPLANNING_TEST.dbo。[FullOrderHeader]。键上建立索引,并在源代码中保留少量行。你能确认一下吗?您能列出目标表的所有索引吗?