从本地表插入远程表这么慢的原因是因为它插入一行,检查它是否插入,然后插入下一行,检查它是否插入等。
不知道你是否明白这一点,但这是我使用链接服务器解决这个问题的方法。
首先,我有一个包含几列的 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 列,因此我可以插入其中。
然后我在远程表上设置了一个触发器,该触发器发生在 Delete 上
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;
--And if I want to clean the table out and make sure it has all the most up to date data:
Delete From RemoteServer.RemoteDB.dbo.Table
通过触发远程服务器从本地服务器提取数据然后进行插入,我能够将需要 30 分钟插入 1258 行的作业变成需要 8 秒才能完成相同插入的作业。
这确实需要双方的链接服务器连接,但是在设置之后它工作得很好。
更新:
所以在过去的几年里,我做了一些改变,并远离了删除触发器作为同步远程表的一种方式。
相反,我在远程服务器上有一个存储过程,其中包含从本地服务器提取数据的所有步骤:
CREATE PROCEDURE [dbo].[UpdateTable]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--Fill Temp table
Insert Into WebFileNamesTemp Select * From MAINSERVER.LocalDB.dbo.WebFileNames
--Fill normal table from temp table
Delete From WebFileNames
Insert Into WebFileNames Select * From WebFileNamesTemp
--empty temp table
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'