加速删除已加入的删除

时间:2012-02-02 22:36:27

标签: sql sql-server performance sql-server-2008

我正在运行一个存储过程来删除两个表中的数据:

delete from TESTING_testresults
from TESTING_testresults
inner join TESTING_QuickLabDump
on TESTING_QuickLabDump.quicklabdumpid = TESTING_TestResults.quicklabdumpid
where TESTING_quicklabdump.[Specimen ID]=@specimen



delete from TESTING_QuickLabDump
from TESTING_Quicklabdump
where [specimen id]=@specimen

一个表是60米行,另一个表是大约2米行

该过程大约需要3秒钟才能运行。

有什么办法可以加快速度吗?也许使用EXISTS

表示IF EXISTS...THEN DELETE - 因为删除不应该每次都发生

类似这样的事情

如果@specimen exists中的TESTING_QuickLabDump然后执行带有两个删除的过程

谢谢!!!

3 个答案:

答案 0 :(得分:2)

重写查询可能不会有助于加快速度。使用profiler查找查询的哪些部分很慢。为此,将其分析器输出execution plan。然后,尝试添加适当的索引。也许一个或两个表可以使用超过[specimen id]的索引。

答案 1 :(得分:1)

对于具有60密耳行的表格,我肯定会考虑水平和/或垂直分割数据。如果它是时间敏感数据,那么您应该能够将旧数据移动到历史表中。这通常是人们做的第一个也是最明显的事情,我想如果你有可能已经做过这样的话。

如果有很多列,那么将数据反规范化为多个表肯定会让您受益。如果你这样做,我建议重命名表并创建一个以原始表命名的所有分区表的视图。这样做可以确保现有代码不会被破坏。

如果你真的想要调整速度,那么你应该考虑获得更快的硬盘并学习一些关于硬盘工作的知识。例如,数据是否存储在高清的内部或外部部分将稍微影响访问速度。固态硬盘已经走了很长的路,所以你可能会考虑购买其中的硬盘。

答案 2 :(得分:1)

除了索引“明显”字段之外,还要查看数据库模式并检查是否有任何FOREIGN KEY,其删除可能会触发ON DELETE CASCADE或SET NULL(与Oracle不同,MS SQL Server将倾向于显示这些执行计划)。幸运的是,通过索引FOREIGN KEY的子端点,这通常很容易解决。

同时检查您是否有任何昂贵的触发器。