暂无图片
Oracle truncate如果不做对象级检查点会有什么影响呢?
我来答
分享
郑楼
2021-03-23
Oracle truncate如果不做对象级检查点会有什么影响呢?

Oracle在执行drop或truncate操作时,会触发object checkpoint,如果在IO较差的情况下,truncate操作也会很慢,如果内部不做检查点,直接更新一些内部表,会有什么影响吗?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
你好我是李白

检查点完成与否其实是dbwr是否把脏块写到了检查点发生时刻的RBA以及SCN,写到了检查点就完成了,没写到就没完成。

可通过设置参数log_checkpoints_to_alert=true在alert观测增量检查点跟thread检查点完成情况。

增量检查点跟对象检查点都是为了促进dbwr能在按照检查点队列LRBA时,顺序、不断增进、阶段性渐进式写出。
另外,dbwr除了按照检查点队列写出,还会按照LRUW写出。

所以理论上,我个人认为(仅代表我个人想法,不一定正确):
这次不做,下次做呗,下次检查点,dbwr就需要多写点了,另外,truncate只修改segment header以及一些位图块修改,I/O较差,理论上不会造成truncate太慢。

truncate原理可参考:
TRUNCATE TABLE恢复系列一:深层剖析内部原理
https://www.modb.pro/db/13856

checkpoint详细原理可参考eygle大佬书籍,控制文件一章节:
《深入解析Oracle : DBA入门、进阶与诊断案例》
https://www.modb.pro/download/2633

暂无图片 评论
暂无图片 有用 0
郑楼

我是真实遇到了,在测试环境,IO性能较差,truncate一个1000w的表要90s左右,如果是这个表刚加载到内存,脏块还没有刷到磁盘,truncate就需要把对象级的脏块全部刷到磁盘,如果这个checkpoints不做是不是有其他危害?

暂无图片 评论
暂无图片 有用 0
lastwinner

任何DDL语句在执行前和执行完成后,都会做一个commit动作,知道了这一点,就好理解了。

暂无图片 评论
暂无图片 有用 0
郑楼

commit动作也只是触发日志从log buffer刷到log file的动作,不一定需要刷内存数据脏块吧?

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏