【发布时间】:2021-06-15 14:59:03
【问题描述】:
我有几个链接服务器,我想在每个链接服务器中插入一个值。在第一次尝试执行时,我使用CURSOR 等待INSERT 的时间太长了。它完成了大约17个小时。但我对那些INSERT 查询很好奇,我使用Display Estimated Execution Plan 检查了我的INSERT 查询的一行,它显示Remote Insert 和Constant Scan 的成本分别为46% 和54%。
在我之前工作过的代码 sn-ps 下方
DECLARE @Linked_Servers varchar(100)
DECLARE CSR_STAGGING CURSOR FOR
SELECT [Linked_Servers]
FROM MyTable_Contain_Lists_of_Linked_Server
OPEN CSR_STAGGING
FETCH NEXT FROM CSR_STAGGING INTO @Linked_Servers
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC('
INSERT INTO ['+@Linked_Servers+'].[DB].[Schema].[Table] VALUES (''bla'',''bla'',''bla'')
')
END TRY
BEGIN CATCH
DECLARE @ERRORMSG as varchar(8000)
SET @ERRORMSG = ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM CSR_STAGGING INTO @Linked_Servers
END
CLOSE CSR_STAGGING
DEALLOCATE CSR_STAGGING
下面还有我如何检查我的查询的估计执行计划的图
我只检查INSERT 查询,而不是所有查询。
如何使用 Remote Insert 获得最佳实践和最佳性能?
【问题讨论】:
-
不要使用游标,只需构建一个包含所有插入的批处理。
-
@Alejandro 谢谢亚历杭德罗。我知道
CURSOR是个坏主意,但我想提高 Remote Insert 的性能,你知道 Remote Insert 的最佳做法和最佳性能吗? -
考虑编写一个使用
SqlBulkCopy的 C# 或 Powershell 脚本,它可能会快很多 -
@Charlieface 谢谢你,我会试试的,我也读过
SqlBulkCopy。
标签: sql sql-server linked-server