喜欢就来多看看
关于剩余数据块的检验 之2
上一篇 /
下一篇 2007-02-13 00:00:00
/ 个人分类:RDBMS
coalesce(结合)会自动执行吗?Oracle的版本不同coalesce的动作就会不同吗?只要看了这次的介绍,大家应该就能明白这两个问题的答案。
接着上次的内容,这次要继续介绍剩余数据块的检验。 进行“coalesce(结合)”有下面三种时间点:
1. 执行alter tablespace<表空间名> coalesce 的时候
2. 每隔5分钟smon会自动执行一次(仅限于设定为表空间pctincrease 0以外的表空间)
3. 不论是否设定为pctincrease 0,假如不执行coalesce,就没有足够的空闲空间分配为extent
上次我们已经介绍了1.的部分,并且说明了执行1. 的指令之后V$LOCK的动作。这次我们将检验2.的部分并且加以说明。 首先,我们先单纯地确认pctincrease取值为0和非0的时候,间隔了5分钟之后会不会执行coalesce。当然,在进行检验之前,先执行CREATE TABLE和DROP TABLE等步骤,创建有extent边界的剩余数据块。换句话说,先让系统生成碎片。结果,在pctincrease为0的情况下,不会执行coalesce,但是在pctincrease非0的情况下会执行coalesce。create tablespace和alter tablespace在default storage指定的pctincrease有两种意义。一种是现在检验的“是否执行coalesce”,另一种是执行create table的时候, 如果没有指定pctincrease,就会以缺省设定使用存放那个表的tablespace的pctincrease。
此外,coalesce是以表空间为单位,所以即使对一些TABLE指定了几个pctincrease,对表空间来说,是以pctincrease是不是0决定。接下来,我们来看看smon执行coalesce的时候为了锁定对象表空间所执行的SQL语句。下面是在Oracle 8.1的环境得到的结果。 ************************************************************* select f.file#, f.block#, f.ts#, f.length from fet$ f, ts$ t where t.ts#=f.ts# and t.dflextpct!=0 and t.bitmapped=0 ************************************************************* |
顺带一提,这个sql语句可以利用
************************************************************* SELECT SID,SQL_TEXT FROM V$SQL ,V$SESSION WHERE ADDRESS = SQL_ADDRESS AND TYPE='BACKGROUND'; ************************************************************* |
在BACKGROUND执行就能看得到sql语句,请大家试试看。另外,看看v$session_wait,就能看到每隔300秒,也就是每隔5分钟,smon就会执行一次。
下面的SID(Session ID)和上面在BACKGROUND执行的SQL语句的SID一致。
************************************************************* SID SEQ# EVENT P1TEXT P1 ---------------------------------------- 5 1457 smon timer sleep time 300 ************************************************************* |
回到原来的主题,执行coalesce的时候为了锁定对象表空间所执行的SQL语句的where语句的t.dflextpct!=0部分,代表pctincrease限定在0以外。另外,where语句的t.bitmapped=0部分是ts# 表的项目,不过其实这和8.1的新功能有关。 执行create database的时候,会执行sql.bsq(oracle_home/rdbms/admin)。其中包括了建立这个ts# 表的script。其中, bitmapped带有下面的说明。/* If not bitmapped, 0 else unit size */
看起来好像是使用bitmap来管理表空间。在USER_TABLESPACES画面,EXTENT_MANAGEMENT项目会根据这个bitmapped以decode函数改换成下面这样。
decode(ts.bitmapped, 0, 'DICTIONARY', 'LOCAL')
如果是0就返回'DICTIONARY'如果不是就返回'LOCAL'。
这里表示了表空间的种类不是'DICTIONARY'就是'LOCAL'。'DICTIONARY'是原来的表空间, 'LOCAL'是Local extent management的表空间。换句话说,如果是原来的表空间就还是会coalesce,但是Oracle 8.1之后的新功能Local extent management的表空间就不会coalesce。
因为Local extent management是Oracle 8.1之后的新功能,所以更早的版本的SQL语句的where语句只到where t.ts#=f.ts# and t.dflextpct!=0为止。
关于Local extent management,过一阵子我们会另外加以检验说明。在Oracle 8.1当中,会在create tablespace的时候决定究竟是Local extent management还是原来的表空间。Oracle 8.1的sql说明手册的create tablespace语句和Oracle 8.1的概要里有详细说明,请大家参考。
大家明白coalesce了吗?此外,关于SMON的自动coalesce功能,根据我们检验的结果,Oracle7.1.6之后的版本都会执行。 (之前的版本我们没有进行检验)
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: