存储过程中使用execute immediate('truncate table tablename')为什么特别慢

catliang 2008-11-28 09:55:44
存储过程中使用execute immediate('truncate table tablename')为什么特别慢


存储过程中使用execute immediate('truncate table tablename')
表中数据量并不大,但是表上有索引,普通磁盘,不是磁盘阵列,磁盘性能较差。
execute immediate('truncate table tablename')一张表,有的要超过一分钟
和什么有关呢?
谢谢,帮我解答啊!~
...全文
3334 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawke1983 2011-10-19
  • 打赏
  • 举报
回复
学习!!!
hiairfly 2008-12-03
  • 打赏
  • 举报
回复
truncate 属于DDL,执行DDL会导致隐式提交。如果前面有大量数据的delete操作,那提交的时间就算在truncate里面了。
truncate后面的commit就是多余的了。
建议将commit放到truncate前面去,显示提交,逻辑也清晰些。
codearts 2008-11-28
  • 打赏
  • 举报
回复
你的表有多大?

truncate时有别的user在使用吗?

感觉1分钟,不是特别的慢呀
catliang 2008-11-28
  • 打赏
  • 举报
回复
9415应该是说在物理上两个地方,并不是指在两个表空间吧。
我认为数据和索引还是放在两个表空间比较好,这样减少磁盘争用。

按9415所说的,truncate table 这么长时间,是正常的吧?
又是违规昵称 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hdhai9451 的回复:]
索引的数据和表的基本数据是放在不同的地方的
也就是执行这个命令要清空两个地方的数据

[/Quote]

楼上的161号大哥, 能不能讲下索引和数据放在同一个表空间的优点,

因为我们这数据库索引都是另建索引表空间的
主要是管理维护方便些
如果是索引的数据坏了, offline drop就行, 再重建

Andy__Huang 2008-11-28
  • 打赏
  • 举报
回复
索引的数据和表的基本数据是放在不同的地方的
也就是执行这个命令要清空两个地方的数据
又是违规昵称 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 catliang 的帖子:]
存储过程中使用execute immediate('truncate table tablename')为什么特别慢


存储过程中使用execute immediate('truncate table tablename')
表中数据量并不大,但是表上有索引,普通磁盘,不是磁盘阵列,磁盘性能较差。
execute immediate('truncate table tablename')一张表,有的要超过一分钟
和什么有关呢?
谢谢,帮我解答啊!~
[/Quote]

truncate是ddl操作, 应该很快才对
是不是表上面有延迟的外键约束, 那么ddl执行会引起事务提交, 并会检查约束的完整性, 这个比较慢
codearts 2008-11-28
  • 打赏
  • 举报
回复
>因为是有delete很多的未写入数据库的数据存在在内存中。

现在原因明了了。

truncate table 属于dll, dll是怎么执行的呢?

begin
commit; --你所说的慢,可能是这一个步骤
ddl-sql; --e.g.: truncate
commit;
except
rollback;
end;
catliang 2008-11-28
  • 打赏
  • 举报
回复
补充说明,之前数据清理的表和truncate的表都是不同的表。
catliang 2008-11-28
  • 打赏
  • 举报
回复
没有别的user,表作为临时表使用,可以说里面一条记录都没有的时候,truncate都需要一分钟。但是经过

我的测试,有以下分析入口:

1。sp中,在truncate table之前有大量的数据清理,也就是带条件的delete,数据量可能上10w级,因为

delete后,不可能马上写入数据库,是不是会导致接下去的truncate时要同步(写入,读取)数据库等操作

,导致truncate空表也需要很长时间,1分钟以上。如果之前的数据清理数据为0,比如第一次运行sp(sp可

以重复运行,第二次运行会在一开始清理计算出的数据),则发现truncate table0.2秒完成。
2。sp中有多条truncate table 如果把第一条truncate table 改成delete,则第二个truncate table会很慢

,如果再把第二个truncate table 改成delete,则第三个truncate table会很慢,总会有第一个truncate

table会很慢。

所以怀疑是不是truncate table有其他数据库的操作,有谁十分清楚truncate的机制?
因为是有delete很多的未写入数据库的数据存在在内存中。
而环境的io性能很差,读写慢。

有高手能认同,或解释吗?

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧