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条记录,或者更新或插入。
任何建议。
答案 0 :(得分:0)
我猜测表中的行数多于您每天更新或插入的30条记录。 如果源表中有时间戳/ rowversion列和主键,则可以在链接服务器中保存时间戳值,然后更新链接服务器中的所有值
local.primary=linked.primary and local.timestamp!=linked.stamp
然后通过选择链接服务器上不存在的主键来仅插入新行。
答案 1 :(得分:0)
对我来说,似乎关键是你不关心数据的年龄(或者你想要每天做1-2次以上),但是你想要对阅读的用户造成最小的干扰数据。
现在,由于你从2012年到2005年都在下降,一些明显的选择将成为问题/不可能,例如复制。并且进行某种MERGE操作(例如,如果你现在甚至有一个ROWVERSION列,使用ROWVERSION来检测两个源之间的变化)可能仍然很麻烦,效率低下,并且可能仍然会破坏尝试在另一端读取数据的用户。
恕我直言最简单的方法是拥有表格的影子副本...你截断它,用所有数据填充它(无论需要多长时间 - 再次,这部分应该无关紧要,因为它是发生在后台),然后将其作为元数据操作交换为真实表。基本上你需要两个额外的模式(shadow
和fake
),在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