喜欢就来多看看

关于剩余数据块的检验 之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 TABLEDROP TABLE等步骤,创建有extent边界的剩余数据块。换句话说,先让系统生成碎片。结果,在pctincrease0的情况下,不会执行coalesce,但是在pctincrease0的情况下会执行coalescecreate tablespacealter tablespacedefault storage指定的pctincrease有两种意义。一种是现在检验的“是否执行coalesce”,另一种是执行create table的时候, 如果没有指定pctincrease,就会以缺省设定使用存放那个表的tablespacepctincrease
此外,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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-01-26  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 36
  • 日志数: 1128
  • 图片数: 1
  • 书签数: 1
  • 建立时间: 2007-12-13
  • 更新时间: 2008-01-01

RSS订阅

Open Toolbar