【问题标题】:Speeding up deletes that have joins加速有连接的删除
【发布时间】:2012-02-02 22:36:27
【问题描述】:

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

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

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

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

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

意思是IF EXISTS...THEN DELETE - 因为删除不应该每次都发生

类似的东西

如果 @specimen existsTESTING_QuickLabDump 中,则执行两个删除的过程

谢谢!!!

【问题讨论】:

  • 您确定是查询(查找要删除的行)还是实际删除行最耗时?
  • 如果索引或其他调整工作没有帮助并且这是一个真正的问题,您可能需要研究表分区,这将允许您在没有开销的情况下执行删除。
  • 也许我在字里行间读到这里,但您是否要逐行删除数据?如果是这样,请尝试基于集合的方法。也就是说,创建一个临时表,其中包含要删除和加入的所有 SpeciminID。
  • 设置结果以文本形式显示,SET SHOWPLAN_ALL ON 然后GO 然后运行您的查询然后GO 然后SET SHOWPLAN_ALL OFF。请在此处发布结果。

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


【解决方案1】:

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

【讨论】:

  • 还在 quicklabdumpid 上添加索引
  • 非常感谢。你能告诉我 user23498293874 分析器如何显示地图(或与之相关)应该添加哪些索引?我明白你在说什么,但我不知道如何实现它
  • 使分析器输出execution plan。我还记得听说过一种工具,它会根据您执行的查询自动建议索引。
  • 是的,当 ssms 输出执行计划时,它还会显示一些有关可能丢失的索引的信息,您可以右键单击它以获取它为您生成它们(好吧,生成一些您将必须稍微编辑,但很明显如何做)。如果您没有看到有关缺失索引的任何信息,则表示它们已经存在,否则就看不到任何其他索引有什么帮助。
  • +1 表示不涉及分析器 :-) 这对于 OP 的用例应该更方便
【解决方案2】:

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

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

如果您“真的”想要微调速度,那么您应该考虑获得更快的硬盘驱动器并了解一些有关硬盘驱动器工作的知识。例如,数据是存储在 HD 的内部还是外部都会稍微影响访问速度。固态硬盘已经走过了漫长的道路,因此您可以考虑购买其中的一款。

【讨论】:

    【解决方案3】:

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

    还要检查您是否有任何昂贵的触发器。

    【讨论】:

      猜你喜欢
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多