【问题标题】:SQL Updating and Inserting dupcliate tables with linked serverSQL 使用链接服务器更新和插入重复表
【发布时间】:2013-08-01 23:39:10
【问题描述】:

SQL Server 2012(本地)到 SQL Server 2005(链接)

我需要使(链接的)服务器与本地服务器保持同步,本地服务器仅包括大约 2-3 个表(而不是整个数据库)。这不是真正的时间敏感,所以我不想使用触发器等。我们只是希望每天运行 1-2 次作为计划任务。

我试过了:

从链接服务器中删除

插入到linked_server (值 1,值 2,值 3) SELECT value1,value2,value3) FROM local_server

但该过程需要大约 45 分钟才能运行。我想更快地做一些事情 - 我已经搜索和搜索但真的找不到任何好的解决方案(这是我的理解水平)。

通常我们所说的只有 30 条左右的记录被更新或插入。

任何建议。

【问题讨论】:

  • 好吧,我不知道移动 30 条记录可能需要 45 分钟 - 在这段时间内查询是否被某些东西阻止了?
  • 我先删除linked_server表记录,然后重新插入所有记录......这是我想要避免的 - 需要根据更改更新或插入记录。
  • 我明白了。这仍然不应该花费 45 分钟(或任何分钟,就此而言)。
  • 我原本以为..但它远程插入了 20,000 - 40,000 条记录,所以可能吗?每张桌子(4 - 5 张桌子)
  • 那你的问题为什么会提到“30条记录”呢?

标签: sql-server insert sql-update


【解决方案1】:

在我看来,关键是您不关心数据的年龄(或者您希望每天执行 1-2 次以上),但您希望对正在阅读的用户造成最小的干扰数据。

现在,由于您从 2012 年到 2005 年要降级,一些明显的选择将是有问题/不可能的,例如复制。并且执行某种 MERGE 操作(例如,使用 ROWVERSION 来检测两个源之间的更改,如果您现在甚至有一个 ROWVERSION 列)仍然可能很麻烦,效率低下,并且可能仍然会干扰尝试读取另一端数据的用户。

恕我直言,最简单的方法是拥有表的影子副本...您将其截断,并用所有数据填充它(无论需要多长时间 - 再次,这部分应该无关紧要,因为它是在后台发生),然后将其交换为真实表作为元数据操作。基本上你有两个额外的模式(shadowfake),在shadow 模式中创建相同的表副本,然后执行这样的操作(最好在 2005 服务器上运行并拉取,而不是推送表单 2012,因此您不必担心分布式事务等):

TRUNCATE TABLE shadow.tablename;

INSERT shadow.tablename([cols]) 
  SELECT [cols] FROM SQL2012.db.dbo.tablename;

-- perhaps an explicit statistics update here

BEGIN TRANSACTION;

  -- this metadata operation is fast and it's the only
  -- block/blockee in this operation.
  ALTER SCHEMA fake TRANSFER     dbo.tablename;
  ALTER SCHEMA dbo  TRANSFER  shadow.tablename;

COMMIT TRANSACTION;

ALTER SCHEMA shadow TRANSFER fake.tablename;

(更好的是在 SQL Server 2012 端有一个存储过程,这样您就可以INSERT...EXEC 并更好地控制隔离级别 - 例如,使用 RCSI 或 shudder 设置它@ 987654327@.)

我在这里写了一篇博客:

http://www.sqlperformance.com/2012/08/t-sql-queries/t-sql-tuesday-schema-switch-a-roo

【讨论】:

  • 我正在使用这个答案,因为我们已经在做类似于影子表的事情.. 但是您博客中的一些信息给了我正在寻找的正确答案。谢谢!
【解决方案2】:

我猜表中的行数比您每天更新或插入的 30 条记录还要多。 如果您的源表中有时间戳/行版本列和主键,您可以将时间戳值保存在链接服务器中,然后更新链接服务器中的所有值

local.primary=linked.primary and local.timestamp!=linked.stamp

然后通过选择链接服务器上不存在的主键仅插入新行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2019-06-11
    • 2011-10-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多