我在SQL Server中有两个表,其中一个是合并到另一个表的源。
源表有30Mil条记录
目标表有180Mil记录。这两个表都有227列。
我确实有SSIS,但有人告诉我,在这种情况下,MERGE语句是更好的选择。下面是它的一个简短版本:
;WITH MySource as (
SELECT * FROM [STAGE].[dbo].[STAGE_TABLE]
)
MERGE [EDW].[dbo].[TARGET_TABLE] AS MyTarget
USING MySource
ON MySource.[ID_FIELD] = MyTarget.[ID_FIELD]
AND MySource.[LoadDate] >= MyTarget.[LoadDate]
WHEN MATCHED THEN UPDATE SET
<<Target Column>> = MySource.<<Source Colums>> --227 columns
WHEN NOT MATCHED THEN INSERT
(
[ID_FIELD],
[LoadDate],
<<225 Other Columns>>
)
VALUES (
MySource.[ID_FIELD],
MySource.[LoadDate],
MySource.<<225 other columns>>
);我对上面的脚本所做的唯一更改是截断列的列表,以保持这里的代码块简短。
我的问题是我在执行死刑时被挂住了。配置文件屏幕显示CXPACKET挂起,并显示错误:cwaitpipenewrow, node=2。
如何对此进行故障排除?谢谢。
发布于 2017-06-24 00:23:30
看起来像CXPACKET和挂起状态意味着一些已经完成的线程正在记录另一个线程的状态,而其他线程还没有完成。请在这里检查。查询需要更新表中最多10亿个值。因此,查询的运行速度会很慢。
https://dba.stackexchange.com/questions/96346/cxpacket-suspended-and-null-wait-type
https://www.sqlshack.com/troubleshooting-the-cxpacket-wait-type-in-sql-server/
希望这些文章能帮助您进行调试。
https://stackoverflow.com/questions/44724856
复制相似问题