我在服务器上运行了一个sql脚本(ServerA) 此服务器具有链接服务器设置(ServerB) - 它位于数据中心的非现场。
此查询相对较为有效:
SELECT OrderID
FROM [ServerB].[DBName].[dbo].[MyTable]
WHERE Transferred = 0
但是,使用此查询更新同一个表时:
UPDATE [ServerB].[DBName].[dbo].[MyTable]
SET Transferred = 1
需要> 1分钟完成(即使只有1列Transferred = 0)
这有什么理由会这么慢吗? 我应该在MyTable上为“已转移”列添加索引吗?
答案 0 :(得分:9)
如果您(我的意思是SQL服务器)无法使用远程端的索引来选择记录,这种远程更新实际上从远程端读取所有记录(主键和其他所需字段),在本地更新这些记录并发回更新的记录。如果你的链接很慢(例如10Mbit / s或更低),那么这种情况需要花费很多时间。
我在远程端使用了存储过程 - 这样你只能远程调用该过程(带有一组可选参数)。如果您的可更新子集很小,那么正确的索引也可能有所帮助 - 但存储过程通常更快。
答案 1 :(得分:3)
UPDATE [ServerB].[DBName].[dbo].[MyTable]
SET Transferred = 1
WHERE Transferred = 0 -- missing this condition?
答案 2 :(得分:0)
该表的使用频率是多少?
如果许多用户同时使用此表,则可能存在锁定/阻止问题。
每当某个进程更新表而不过滤记录时,整个表都被事务锁定,而另一个需要更新表的进程等待。
在他的情况下,你可能正在等待其他一些过程解锁表。