2009-10-27 67 views
2
delete from a A where a.ID = 132. 

表A包含大约5000条记录,而A.ID是表A中的主键,但删除需要很长时间。有时它也会超时。该表包含三个索引,并由三个外键引用。任何人都可以解释为什么即使我们根据主键删除了很长时间。并请告诉我一些方法来优化这个问题......?SQL删除性能

+0

你是什么意思的“长时间”?任何操作,即使是全表扫描,都应该在5000行的表上快速运行。 – 2009-10-27 23:39:40

回答

3

显然它不应该花很长时间。然而,这里没有足够的信息来弄清楚为什么。不过,我可以告诉你,你应该关注外键。

如果他们强加其他更大的表的限制,这些可以减慢速度。你也可能会发现你的超时是由于完整性检查导致的,这会阻止删除(然后问题是你没有收到异常而不是超时)。

我的下一步是删除外键,然后检查性能。然后每次添加一个,然后检查性能。

其他操作(例如插入,选择,更新)需要很长时间吗?

12

可能的原因:

1)级联删除操作

2)触发(S)

3)主键列的类型是不是整数以外的东西,从而迫使一个类型转换每个pk值来做比较。这需要全表扫描。

4)你的查询是否真的以你发布在问题中的点为终点?如果是的话,该数目可以被认为是一个浮点数,而不是一个整数,从而导致类似于3类型转换)

5)的删除查询是等待其他某些慢查询释放锁

+1

触发器建议+1 ...... – Knobloch 2009-10-27 16:00:12

+0

特别检查级联删除到任何本身索引严重的大表。 – 2009-10-28 17:42:52

1

首先想到:外键上的索引?

  • 这关系到将删除提及
  • 所有子表MutS的检查,如果你有500个000子行,这可能需要过程的一段时间级联...

二想法:触发器开火?

  • 在这个表或子表,或通过代码等
  • 上帝保佑,光标在删除每一行时试图级联...
0

正如其他人所观察到的,可能是犯罪嫌疑人外键。

首先,因为ON DELETE CASCADE可以聚集动量,如果依赖表反过来被其他表引用,而其他表又可以引用,依此类推。

其次,因为其他用户可能锁定需要删除的行。这是超时最可能的原因。这很有效,取决于数据库的风格和版本。例如,Oracle的旧版本(< = 8.0)需要锁定整个依赖表,除非外键列被编入索引。

1

尝试更新统计信息。 5000行不是什么大不了的事情。如果你经常这样做,你应该安排在这张桌子上进行维护(即重建索引,更新统计数据等)