如何知道一个表曾经被压缩过

转自: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随之修改了t1hakan_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这里并没有再去修改t1hakan_kqldtvc

 

所以我们的结论就是----利用tab$中的spare1字段即可判断出某个表是否曾经被压缩过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值