【问题标题】:Very Slow SQL Update using a Linked Server使用链接服务器的 SQL 更新非常慢
【发布时间】:2011-01-17 11:25:32
【问题描述】:

我有一个在服务器 (ServerA) 上运行的 sql 脚本 此服务器已设置链接服务器 (ServerB) - 它位于数据中心的异地。

这个查询运行得比较快:

SELECT OrderID
FROM [ServerB].[DBName].[dbo].[MyTable]
WHERE Transferred = 0

但是,当使用此查询更新同一个表时:

UPDATE [ServerB].[DBName].[dbo].[MyTable]
SET Transferred = 1

完成需要 > 1 分钟(即使只有 1 列 Transferred = 0)

有什么理由会这么慢吗? 我应该在 MyTable 上为“Transferred”列创建索引吗?

【问题讨论】:

  • 只是一个想法 - 您是否尝试将 where transferred = 0 添加到更新语句中?不确定这是否会有所作为。另外,看看这两个查询的执行计划。

标签: sql sql-server linked-server


【解决方案1】:

如果您(我的意思是 SQL 服务器)不能使用远程端的索引来选择记录,那么这种远程更新实际上会从远程端读取所有记录(主键和其他需要的字段),在本地更新这些记录并将更新的记录发回。如果您的链接很慢(比如 10Mbit/s 或更少),那么这种情况需要很多时间。

我在远程端使用了存储过程——这样你应该只远程调用该过程(使用一组可选参数)。如果您的可更新子集很小,那么适当的索引也可能会有所帮助 - 但存储过程通常更快。

【讨论】:

    【解决方案2】:
    UPDATE [ServerB].[DBName].[dbo].[MyTable]
    SET Transferred = 1
    WHERE Transferred = 0   -- missing this condition?
    

    【讨论】:

    • 不 - 仍然是同样的问题。为了这个问题,我简化了我的查询,“真实”查询连接到一个临时表——我认为这可能是问题所在,所以尝试了文字“UPDATE table SET transfer = 1”,它需要 2 分钟完成!
    • 连接可以包含过滤器来减少它需要在远程数据库中访问的记录。而没有 WHERE 子句的更新.. 更新 ENTIRE 表并且只要表中有记录就需要很长时间。大表 = 更长的更新。
    • 正如我所说,运行您发布的确切查询所需的时间完全相同。
    【解决方案3】:

    这张表的使用频率如何?

    如果这个表被多个用户同时使用,你可能会遇到lock/block的问题。

    每次有进程更新表而不过滤记录,整个表被事务锁定,其他需要更新表的进程等待。

    在他的情况下,您可能正在等待其他进程来解锁表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多