的从本地表插入到远程表的速度太慢的原因是,它插入一行,检查它是否插入,然后插入下一行,检查它是否插入等。
不知道是否你弄明白了这一点,但这里是我如何使用链接服务器解决这个问题。
首先,我有几个列的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;
--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分钟的作业插入到需要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'
这对性能没有任何影响。 –
这个答案其实是非常真实的,但它不适合这个问题/主题 - 然而,任何人阅读它应该知道这是很好的建议,因此我upvote的答案,但这个评论。 –