【发布时间】:2018-01-25 19:07:12
【问题描述】:
我将运行一个 MERGE SQL 查询来查询我的源表中的一百万条记录并插入到我的目标表中。我在 Merge 中执行 SELECT 的这张表正在生产中。该表将有一个应用程序,其中有许多用户同时访问该表进行 SELECT、INSERT、UPDATE、DELETE。我不会用我的 MERGE 语句修改源表数据,只修改目标表。我将启用 SQL 快照隔离,因此没有理由使用 NOLOCK 提示。有没有办法让查询分批运行,或者让 MERGE 语句扫描整个表更有效?我还有 2 个其他合并语句,我将在初始 INSERT 之后运行对目标表执行的任何更改的 INSERT、UPDATE、DELETE。是否需要采取任何预防措施以免导致生产应用程序出现性能问题?我将使用存储过程,因为我将在多个表上运行这些查询,这些表将一遍又一遍地执行相同的功能。
我的示例初始 MERGE:
MERGE dl178 as TARGET
USING dlsd178 as SOURCE
ON (TARGET.docid = source.docid AND TARGET.objectid = source.objectid AND target.pagenum = source.pagenum
and target.subpagenum = source.subpagenum
and target.pagever = source.pagever and target.pathid = source.pathid
and target.annote = source.annote)
WHEN NOT MATCHED BY TARGET
THEN INSERT (docid, pagenum, subpagenum, pagever, objectid, pathid, annote, formatid, ftoffset, ftcount)
VALUES (
source.docid, source.pagenum, source.subpagenum, source.pagever,
source.objectid, source.pathid,source.annote ,source.formatid ,source.ftoffset, source.ftcount)
OUTPUT $action, Inserted.*;
【问题讨论】:
-
您使用的是哪个 dbms?