0

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

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

我试过了:

从linked_server删除

插入到linked_server (value1,value2,value3) SELECT value1,value2,value3) FROM local_server

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

通常我们只讨论 30 条左右的记录,要么更新要么插入。

有什么建议么。

4

2 回答 2

0

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

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

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

于 2013-08-01T15:32:31.960 回答
0

对我来说,关键似乎是您不在乎数据的年龄(或者您希望每天执行 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 NOLOCK进行设置。)

我在这里写了一篇博客:

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

于 2013-08-01T15:39:10.313 回答