ctas为何报错不能扩展temp segment

在一个表空间上建表的时候,报错了:

在这边比较奇怪,为什么是不能扩展temp segment,而不是报错:

老白说,这是因为CTAS的时候,创建的表的BLOCK首先被标志为TEMP,等表全部创建完了再改为PERM,这样当CTAS出现问题的时候,不需要回退,只需要以后回收临时段就可以了。

为了验证,做了个10046的trace,发现确实是这样:

在这边,我们看到seg$的type#一开始是3,到最后update成5。

那么,type#=3是否就是temp segment,type#=5是否就是permanent呢?进一步查找,考虑到dba_segments中有segment_type,且有显示这个类型的名称,就从这个表入手:

进一步查看sys_dba_segs:

这边已经基本看出了sys_dba_segs是从基表seg$来的,而且在sys_dba_segs这个表上基本已经有type#和decode之后的type#,即SEGMENT_TYPE_ID和SEGMENT_TYPE:

我们这边确实看到,ctas一开始时候的type#是3是TEMPORARY的segment,之后type#被update成5,是属于CLUSTER、NESTED TABLE 、TABLE、TABLE PARTITION 、TABLE SUBPARTITION的一种。

其实如果我们希望进一步研究各个type名称和type编号,找出所有的segment_type和segment_type_id我们注意到:

在这个表的第三和第四个字段,根据这表的dml,我们先发现decode(s.type#, 1, ‘ROLLBACK’, 10, ‘TYPE2 UNDO’),s.type#,和decode(s.type#,2,’DEFERRED ROLLBACK’,3,’TEMPORARY’,4,’CACHE’,9,’SPACE HEADER’,’UNDEFINED’),s.type#。剩下的5,6,7,8的类型要去找SYS_OBJECTS.object_type, seg$.type#。

我们根据这个表分别取到各个segment的类型:

由于我的数据库中不存在的’LOB PARTITION’, ‘LOB SUBPARTITION’,初步判定type#为7的是’LOB PARTITION’, ‘LOB SUBPARTITION’。

综上所述,所有的seg$的type#编号和类型对应如下:

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据