【问题标题】:SQL Server 2014 slow remote insertSQL Server 2014 慢速远程插入
【发布时间】:2021-06-15 14:59:03
【问题描述】:

我有几个链接服务器,我想在每个链接服务器中插入一个值。在第一次尝试执行时,我使用CURSOR 等待INSERT 的时间太长了。它完成了大约17个小时。但我对那些INSERT 查询很好奇,我使用Display Estimated Execution Plan 检查了我的INSERT 查询的一行,它显示Remote InsertConstant 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


【解决方案1】:

你可以试试这个,但我认为差异应该可以忽略不计更好。我确实记得,在阅读跨链接服务器插入方法的差异时,大多数标准方法基本上彼此相当,尽管我已经有一段时间没有查到了,所以不要引用我的话。

由于方法上的明显差异,它还需要您进行一些轻微的重写(并且假设您无论如何都可以这样做)。执行此操作所需的动态 sql 可能很棘手,因为我不完全确定您是否可以在动态 sql 中调用 openquery(我应该知道这一点,但我从来不需要)。

但是,如果您可以使用这种方法,主要好处是 where 子句无需选择任何数据即可获取目标架构(因为 1 永远不会等于 0)。

INSERT OPENQUERY (
    [your-server-name],
    'SELECT             
        somecolumn
        , another column        
    FROM destinationTable
    WHERE 1=0'   
    -- this will help reduce the scan as it will 
    -- get schema details without having to select data
    )
SELECT
    somecolumn
    , another column        
FROM sourceTable

您可以采取的另一种方法是在目标服务器/数据库上构建插入过程。然后,您只需通过发送参数来调用 proc。虽然是的,这需要更多的工作,并且引入了更多需要维护的对象,但它增加了您的流程的简单性,并可能在跨链接服务器发送内容时减少 I/O,更不用说可以节省持续扫描的 CPU 成本,因为好。我认为它可能是一种更简洁的方法,而不是尝试优化链接服务器的行为。

【讨论】:

  • 感谢您的评论道格。对不起,我对 SQL Server 缺乏了解,我不使用另一个表来做 INSERT ,它只是纯粹的 INSERT INTO Linked_Server_Table VALUES (1,2,3) ,但我会尝试用过程来做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多