从本地表插入远程表速度缓慢的原因是它会插入一行,检查它是否插入成功,然后再插入下一行,继续检查,如此循环。不知道您是否已经解决了这个问题,但我用链接服务器解决了这个问题。首先,我有一个LocalDB.dbo.Table带有几列:
IDColumn (int, PK, Auto Increment)
TextColumn (varchar(30))
IntColumn (int)
我有一个几乎相同的RemoteDB.dbo.Table:
IDColumn (int)
TextColumn (varchar(30))
IntColumn (int)
主要区别在于远程IDColumn没有设置为ID列,这样我就可以向其中插入数据。
然后我在远程表上设置了一个触发器,它会在删除时触发。
Create Trigger Table_Del
On Table
After Delete
AS
Begin
Set NOCOUNT ON;
Insert Into Table (IDColumn, TextColumn, IntColumn)
Select IDColumn, TextColumn, IntColumn from MainServer.LocalDB.dbo.table L
Where not exists (Select * from Table R WHere L.IDColumn = R.IDColumn)
END
当我想要进行插入操作时,我会从本地服务器执行以下操作:
Insert Into LocalDB.dbo.Table (TextColumn, IntColumn) Values ('textvalue', 123);
Delete From RemoteServer.RemoteDB.dbo.Table Where IDColumn = 0;
Delete From RemoteServer.RemoteDB.dbo.Table
通过触发远程服务器从本地服务器提取数据并进行插入,我成功将需要30分钟才能插入1258行数据的工作转换为只需8秒钟即可完成相同的插入工作。这确实需要在两侧都建立链接服务器连接,但是设置好之后效果还是不错的。
更新:
在过去的几年中,我已经做出了一些改变,并且不再使用删除触发器来同步远程表。
相反,我在远程服务器上有一个存储过程,其中包含从本地服务器提取数据的所有步骤:
CREATE PROCEDURE [dbo].[UpdateTable]
AS
BEGIN
SET NOCOUNT ON;
Insert Into WebFileNamesTemp Select * From MAINSERVER.LocalDB.dbo.WebFileNames
Delete From WebFileNames
Insert Into WebFileNames Select * From WebFileNamesTemp
Delete From WebFileNamesTemp
END
在本地服务器上,我有一个定时任务对本地表进行处理,然后通过存储过程触发更新:
EXEC sp_serveroption @server='REMOTESERVER', @optname='rpc', @optvalue='true'
EXEC sp_serveroption @server='REMOTESERVER', @optname='rpc out', @optvalue='true'
EXEC REMOTESERVER.RemoteDB.dbo.UpdateTable
EXEC sp_serveroption @server='REMOTESERVER', @optname='rpc', @optvalue='false'
EXEC sp_serveroption @server='REMOTESERVER', @optname='rpc out', @optvalue='false'