SQL使用链接服务器更新和插入dupcliate表

时间:2013-08-01 15:19:10

标签: sql-server insert sql-update

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

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

我试过了:

DELETE FROM linked_server

INSERT INTO linked_server (值1,值2,值3) SELECT value1,value2,value3)FROM local_server

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

通常我们只会说30条记录,或者更新或插入。

任何建议。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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