【问题标题】:SQL Merge and large table dataSQL Merge 和大表数据
【发布时间】: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?

标签: sql merge


【解决方案1】:

您是否考虑过分区切换或更改数据捕获?听起来您正在尝试启动一个持续的 ETL 流程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多