Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助优化SQL Server查询吗_Sql_Sql Server_Query Optimization - Fatal编程技术网

需要帮助优化SQL Server查询吗

需要帮助优化SQL Server查询吗,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,我正在处理我们的报告数据库。我们目前的数据转储过程一直有很多问题,我正试图重新设计它 每小时,我们都会将生产数据添加到表中。具体说一个表,它只有100多万行(通常更少)。我需要获取这些行并将其附加到reporting server表中。目前,我正在使用一个使用合并进程的存储过程(使用目标、源技术)。每小时运行大约需要16分钟。有谁对追加/更新行有更好的想法吗?我们访问的生产表也只包含今天的数据,所以我甚至不需要添加日期过滤器来减少数据负载。优化性能的最佳方法是什么? 以下是执行计划: 以下是程序

我正在处理我们的报告数据库。我们目前的数据转储过程一直有很多问题,我正试图重新设计它

每小时,我们都会将生产数据添加到表中。具体说一个表,它只有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]。键上建立索引,并在源代码中保留少量行。你能确认一下吗?您能列出目标表的所有索引吗?