转自:http://dbsnake.com/2010/08/tab-hakan-kqldtvc.html
这篇文章其实并没有什么实际的意义,这只是我在研究compress block中顺便写的一个例子。
如何知道一个表曾经被压缩过?注意这里有"曾经"二字。
我们来看一下sql.bsq中对tab$的定义:
create table tab$ /* table table */
( obj# number not null, /* object number */
/* DO NOT CREATE INDEX ON DATAOBJ# AS IT WILL BE UPDATED IN A SPACE
* TRANSACTION DURING TRUNCATE */
dataobj# number, /* data layer object number */
ts# number not null, /* tablespace number */
file# number not null, /* segment header file number */
block# number not null, /* segment header block number */
......省略显示部分内容
trigflag number, /* first two bytes for trigger flags, the rest for */
/* general use, check tflags_kqldtvc in kqld.h for detail */
/* 0x00000001 deferred RPC Queue */
/* 0x00000002 snapshot log */
/* 0x00000004 updatable snapshot log */
/* 0x00000008 = context trigger */
/* 0x00000010 = synchronous change table */
/* 0x00200000 = table had rowmovement */
/* enabled at some point in past */
spare1 number, /* used to store hakan_kqldtvc */
spare2 number, /* committed partition # used by drop column */
spare3 number, /* summary sequence number */
spare4 varchar2(1000), /* committed RID used by drop column */
spare5 varchar2(1000),
spare6 date /* flashback timestamp */
)
cluster c_obj#(obj#)
/
注意到这里对spare1字段的解释是/* used to store hakan_kqldtvc */,在oracle中,一个表里的单个block所能容纳的最大行数我们称之为hakan factor,其对应的结构的名称就是hakan_kqldtvc。
聪明的朋友们看到这里一定已经知道我想说什么了。
好了,我们这里来看一个如何判断某个表是否曾经被压缩过的例子:
SQL> create table t1 (id number,name varchar2(10));
Table created
SQL> select obj# from sys.obj$ where name='T1';
OBJ#
----------
170740
SQL> select spare1 from sys.tab$ where obj#=170740;
SPARE1
----------
736
SQL> alter table t1 compress;
Table altered
SQL> select compression from dba_tables where table_name='T1';
COMPRESSION
-----------
ENABLED
SQL> select spare1 from sys.tab$ where obj#=170740;
SPARE1
----------
163831
从结果里我们可以看到,当我把t1 compress后,oracle随之修改了t1的hakan_kqldtvc。
SQL> alter table t1 nocompress;
Table altered
SQL> select compression from dba_tables where table_name='T1';
COMPRESSION
-----------
DISABLED
SQL> select spare1 from sys.tab$ where obj#=170740;
SPARE1
----------
163831
从结果里可以看到,当我再把t1恢复成正常表的时候,oracle这里并没有再去修改t1的hakan_kqldtvc。
所以我们的结论就是----利用tab$中的spare1字段即可判断出某个表是否曾经被压缩过。