SQL DELETE花费太多时间

时间:2018-08-28 10:52:17

标签: sql-server azure-sql-database sqlprofiler azure-sql-server

我有一个带有表的 Azure SQL Server (标准层,S3)。我有一个特定的查询需要很长时间才能执行:

DELETE FROM MyTable WHERE ID=@ID

此表有15万行。删除查询需要+ -10分钟。

我试图理解原因。首先检查在SELECT查询中定位该行的速度。我跑:

SELECT * FROM MyTable WHERE ID=@ID

结果:不到2秒。

我在this thread中了解了此问题。我选择了答案,并从中提取了检查清单。在里面查看我的答案。

清单:

  • 删除很多记录- 该查询将精确删除1行。
  • 许多索引- MyTable具有:1 PK,1 FK,4个索引,除此之外没有其他。所以我相信这不是问题。
  • 在子表的外键上缺少索引-我唯一的FK在另一个表上也有INDEX。
  • 触发器-没有触发器。
  • 级联删除(要删除的十个父记录可能意味着要删除数百万个子记录)-我试图删除其他表中引用的行。因此,级联删除不应删除其他表上的任何内容。
  • 要检查的许多外键-不确定是什么意思。我只有一个FK指向非常小的表(<10行+索引)。
  • 需要增长的交易日志-如何检查?
  • 死锁和阻止-如何检查?

我的直觉是,它某种程度上取决于引用该表的其他表(MyTable对它们而言是FK)。由于我有+ -15张桌子,所以我不知道如何定位问题。

其他观察结果:我发现了一些有趣的东西。如果您一个接一个地运行删除操作,则第一个调用会花费很多时间(如上所述),第二个调用会更快,依此类推。如果您多次运行此查询,它将变得非常快(<3秒-很棒)。几个小时后-它又变慢了。

问题:

  1. 还有什么要检查的?
  2. 是否可以运行DELETE查询并对它进行分析?假设table2具有MyTable的FK,并且搜索行@ID花费了大量时间。也许我可以使用一个工具说:“ 99%的执行时间花在table2上?”
  3. 其他任何提示都将受到欢迎!

谢谢!

1 个答案:

答案 0 :(得分:1)

解决了问题。

为此,我做了:

  1. 手动检查数据库中的所有表,并确认它们具有FK到MyTable的索引。我发现4个表缺少索引。这些表很小(<1K行)。不确定效果如何。
  2. 我有一个执行了很多次的SP。该SP在FK到MyTable的表之一上运行带有锁的事务。我卸下了锁。 Agian,由于我上面提到的方法是该行实际上在其他表上没有任何FK行,因此不确定其有效性。

但是,现在它就像一种魅力!执行时间<1秒!