【发布时间】:2019-04-24 07:30:08
【问题描述】:
我正在尝试将大量数据从 PROD DB 中的一个表插入到存档 DB 中的表中。表具有相同的架构,存档表具有下降的索引和“身份插入”。我只需要插入 Arh DB/Table 中不存在的记录。 我在 SSIS 序列包中使用“执行 SQL 任务”,它的工作速度非常慢(使用 20000 插入批量大小)。我在 10 分钟内插入了 20000 条记录。顺便提一下,我需要插入 48000000 条记录。 SQL Server 是 2016 标准版。 有什么解决办法吗?
SQL 查询是:
SELECT TOP (@InsertBatchSize) s.ID,.....and other columns
FROM PRODDB.dbo.source_table AS s WITH (NOLOCK)
INNER JOIN ArchiveDB.dbo.MissingIDsTable AS t WITH (NOLOCK)
ON s.ID = t.ID
WHERE s.ID not in (SELECT ID
from ArchiveDB..destination_table
WHERE IsUpdated is null )
【问题讨论】:
-
20K 行应该需要几秒钟。不要使用“执行 SQL”来移动数据。这与简单地执行 SQL 查询或存储过程相同。移动数据是数据流的工作。至于仅移动更改的行,您如何首先检测到行更改?左连接?使用存储的 ID 值?使用更改跟踪?
-
如果您使用“执行 SQL”,延迟是由查询引起的,而不是 SSIS。查询有什么作用?它从哪里获取数据?
-
首先我将丢失的 ID 插入到 ARH_DB 端的一个物理表中。这工作得很快。此外,我在名为 isupdated 的 Arh_table 中有一个标志,当我更新已插入的列时,我正在用值 1 更新这个标志(这一步没问题)。目标(存档表)在插入名为 IsInserted 的新记录时默认包含 1。
-
----Bellow 是选择应该移动的数据的代码-------- SELECT TOP (@InsertBatchSize) s.ID,.....等列FROM PRODDB.dbo.source_table AS s WITH (NOLOCK) INNER JOIN ArchiveDB.dbo.MissingIDsTable AS t WITH (NOLOCK) ON s.ID = t.ID WHERE s.ID not in (SELECT ID from ArchiveDB..destination_table WHERE IsUpdated 是空)
-
在问题本身中发布代码。虽然很明显您已经发现查询速度很慢,并试图以错误的方式解决这个问题。
NOLOCK不是“不拿锁”的意思,而是“不尊重别人的锁,读脏数据,自己拿多余的锁”
标签: sql sql-server ssis