2012-02-02 52 views
1

我运行一个存储过程从两个表中删除数据:加快具有删除加入

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



delete from TESTING_QuickLabDump 
from TESTING_Quicklabdump 
where [specimen id][email protected] 

一个表为60μm行,另一种是2m左右行

过程大约需要3运行几秒钟。

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

意味着IF EXISTS...THEN DELETE - 因为删除不应该发生的每一次

像这样

如果@specimen existsTESTING_QuickLabDump然后执行程序与两个删除

谢谢!

+0

是否确定,如果它是查询(找到要删除的行),或花费最多时间的实际行删除? – Magnus 2012-02-02 22:45:04

+0

如果建立索引或其他调整工作无效,并且这构成了一个实际问题,您可能需要查看表分区,这将允许您在没有开销的情况下执行删除操作。 – 2012-02-03 00:10:50

+1

也许我正在阅读这里的内容,但是您是否试图逐行删除数据?如果是这样,请尝试一种基于集合的方法。也就是说,创建一个临时表,保存所有SpeciminID以删除并加入它。 – 2012-02-03 01:07:48

回答

1

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

如果有很多列那就肯定有利于你的数据非规范化成多个表。如果你这样做了,我会建议重命名这些表并创建一个以原始表命名的所有分区表的视图。这样做应该确保现有代码不被破坏。

如果你“真的”要微调的速度,那么你应该考虑得到一个更快的硬盘和了解一点硬盘的工作方式。例如,数据是否存储在HD的内部或外部将会影响访问速度。而固态硬盘已经走了很长的路,所以你可能会考虑获取其中的一个。

+0

,这应该会更方便一些关于“硬盘如何”工作的信息。 – 2012-02-04 00:20:34

2

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

+0

同时在quicklabdumpid – usr 2012-02-03 00:19:59

+0

上添加索引非常感谢。你能告诉我user23498293874 profiler显示映射(或涉及)哪些索引应该被添加?我明白你在说什么,但我不知道如何实现它 – 2012-02-03 17:47:25

+0

使分析器输出为[执行计划](http://www.sql-server-performance.com/2006/query-execution-plan-analysis/ )。我还记得听说过一个工具,它会根据您执行的查询自动建议索引。 – krlmlr 2012-02-03 23:32:03

1

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

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