【问题标题】:SQL delete query takes too longSQL 删除查询耗时过长
【发布时间】:2020-11-09 14:26:22
【问题描述】:

我使用任一查询 1:

    delete dp
    from [linkedserver\sqlserver].[test].[dbo].[documentpos] dp
    where not exists (
    select 1 from document d where d.GUID = dp.documentguid
    )

或查询2:

    DELETE cqdp 
    FROM [linkedserver\sqlserver].[test].[dbo].[documentpos] cqdp
    left join Document cqd on cqd.GUID = cqdp.DocumentGUID
    where cqd.guid is null

两个查询的作用相同,但耗时太长。 2天后我取消了执行。

这是两个查询的估计执行计划:

我还有其他使用相同链接服务器的查询,这些查询不会花这么长时间。但显然链接服务器存在问题(远程扫描 98% 的时间)。我可以做些什么来降低远程扫描的成本?

【问题讨论】:

  • 我过去曾遇到过链接服务器效率方面的问题。您是否尝试将Document 中的记录(可能通过插入临时表#)引入[linkedserver\sqlserver].[test] 数据库,然后在那里运行DELETE SQL 语句?
  • 您尝试过使用OPENQUERY 吗?大多数情况下,这会为您提供更好的执行时间。您还可能缺少外键列上的一些索引。您可以删除并重新创建外键以加快删除速度。但仅当您控制所有连接时。(单用户模式)
  • 批量删除? DELETE TOP 1000...

标签: sql-server left-join sql-delete linked-server not-exists


【解决方案1】:

试试这个:

 SELECT DISTINCT GUID
 INTO [linkedserver\sqlserver].[test].[dbo].[temp_guids]
 FROM document 
  

DELETE cqdp 
FROM [linkedserver\sqlserver].[test].[dbo].[documentpos] cqdp
left join [linkedserver\sqlserver].[test].[dbo].[temp_guids] cqd on cqd.GUID = cqdp.DocumentGUID
where cqd.guid is null

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 2013-07-24
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多