我有一个带有表的 Azure SQL Server (标准层,S3)。我有一个特定的查询需要很长时间才能执行:
DELETE FROM MyTable WHERE ID=@ID
此表有15万行。删除查询需要+ -10分钟。
我试图理解原因。首先检查在SELECT查询中定位该行的速度。我跑:
SELECT * FROM MyTable WHERE ID=@ID
结果:不到2秒。
我在this thread中了解了此问题。我选择了答案,并从中提取了检查清单。在里面查看我的答案。
MyTable
具有:1 PK,1 FK,4个索引,除此之外没有其他。所以我相信这不是问题。我的直觉是,它某种程度上取决于引用该表的其他表(MyTable
对它们而言是FK)。由于我有+ -15张桌子,所以我不知道如何定位问题。
其他观察结果:我发现了一些有趣的东西。如果您一个接一个地运行删除操作,则第一个调用会花费很多时间(如上所述),第二个调用会更快,依此类推。如果您多次运行此查询,它将变得非常快(<3秒-很棒)。几个小时后-它又变慢了。
DELETE
查询并对它进行分析?假设table2
具有MyTable
的FK,并且搜索行@ID
花费了大量时间。也许我可以使用一个工具说:“ 99%的执行时间花在table2
上?” 谢谢!
答案 0 :(得分:1)
解决了问题。
为此,我做了:
MyTable
的索引。我发现4个表缺少索引。这些表很小(<1K行)。不确定效果如何。MyTable
的表之一上运行带有锁的事务。我卸下了锁。 Agian,由于我上面提到的方法是该行实际上在其他表上没有任何FK行,因此不确定其有效性。但是,现在它就像一种魅力!执行时间<1秒!