![]() |
1
2
Select正在进行全表扫描。另一方面,删除(在Oracle中)必须将整个已删除的行存储在回滚段中,以便稍后撤消更改(因此,它甚至可能比插入还要慢)。 你可以在Ask Tom论坛上找到一个与此相关的非常长且有用的讨论。根据您的业务案例,也许您可以应用更多的技术。 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2345591157689 |
![]() |
2
4
一种可能是锁。也就是说,表中有一行已被另一个删除操作提交并锁定。你的删除命令被锁定了。提交锁定事务后,您的删除就可以完成了。 第二种可能是您首先运行了删除,这会将块从磁盘提取到缓存中(这需要时间)。当选择运行时,数据在缓存中,因此运行得更快。我认为这不太可能,因为您选择的统计数据表明“5252物理读取”,所以它没有从SGA缓存中获取它们。不过,可能涉及磁盘缓存。 第三种可能性是有一个前后删除触发器(不是针对每一行)可以执行某些操作。 第四种可能是删除导致块清除延迟。当实际删除这些行时,如果在提交之前将它们写入磁盘,那么它们仍然具有锁/事务信息。您的删除会出现,读取块,查看现在过时的事务信息,删除它并重新写入块。 第五种可能性是争论。也许在删除的同时发生了更多的事情。 很多可能性。如果可以复制它,那么使用wait事件进行跟踪,并通过tkprof运行它。 |
![]() |
3
3
如果您以前的表中充满了大量数据,那么Oracle会将其扫描到最高水位线,即使它现在没有数据。可以使用truncate语句重置hwm。 |
![]() |
4
2
--编辑:抱歉,没有完全阅读问题。如果表为空,则它不能是索引问题。否则我会很惊讶的-- |
![]() |
5
1
如果您经常从一个表中删除所有行,“truncate table xxx”通常比批量删除快得多。也许试试看你能跑多快。 |
![]() |
Community wiki · SQL语法新手 1 年前 |
![]() |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |