ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20130721]ORACLE 12C Invisible Columns.txt

[20130721]ORACLE 12C Invisible Columns.txt

原创 Linux操作系统 作者:lfree 时间:2013-07-23 10:04:19 0 删除 编辑
[20130721]ORACLE 12C Invisible Columns.txt

在ORACLE 12C中有了Invisible Columns的概念,就是在表中真实的存在该列,但是通过设置Invisible可以实现不显示该列。
自己测试看看。

SQL> select banner from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE    12.1.0.1.0      Production
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production

SQL> create table t (a number,b number ,c number);
Table created.

SQL> select object_id,data_object_id from dba_objects where wner=user and object_name='T';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     92476          92476

SQL> select obj#,col#,segcol#,SEGCOLLENGTH,OFFSET, NAME,TYPE#,LENGTH , INTCOL# from sys.col$ where obj#= 92476;
      OBJ#       COL#    SEGCOL# SEGCOLLENGTH     OFFSET NAME                      TYPE#     LENGTH    INTCOL#
---------- ---------- ---------- ------------ ---------- -------------------- ---------- ---------- ----------
     92476          1          1           22          0 A                             2         22       1
     92476          2          2           22          0 B                             2         22       2
     92476          3          3           22          0 C                             2         22       3

--因为我创建的是普通表,注意看COL#,SEGCOL#,INTCOL#相同。
--intcol#为创建表时的列顺序,col#初始情况下跟intcol#相同。而segcol#表示列在数据段上存储时的顺序。
--如果是IOT,cluster table可能不同。

SQL> ALTER TABLE t MODIFY (a invisible);
Table altered.

SQL> select obj#,col#,segcol#,SEGCOLLENGTH,OFFSET, NAME,TYPE#,LENGTH , INTCOL# from sys.col$ where obj#= 92476;
      OBJ#       COL#    SEGCOL# SEGCOLLENGTH     OFFSET NAME                      TYPE#     LENGTH    INTCOL#
---------- ---------- ---------- ------------ ---------- -------------------- ---------- ---------- ----------
     92476          0          1           22          0 A                             2         22       1
     92476          1          2           22          0 B                             2         22       2
     92476          2          3           22          0 C                             2         22       3

SQL> ALTER TABLE t MODIFY (a visible);
Table altered.

SQL> select obj#,col#,segcol#,SEGCOLLENGTH,OFFSET, NAME,TYPE#,LENGTH , INTCOL# from sys.col$ where obj#= 92476;
      OBJ#       COL#    SEGCOL# SEGCOLLENGTH     OFFSET NAME                      TYPE#     LENGTH    INTCOL#
---------- ---------- ---------- ------------ ---------- -------------------- ---------- ---------- ----------
     92476          3          1           22          0 A                             2         22       1
     92476          1          2           22          0 B                             2         22       2
     92476          2          3           22          0 C                             2         22       3

--可以发现COL#的顺序发现了变化,利用这个特性可以实现修改显示select *时列的展示顺序(Column Ordering)。

SQL> set linesize 40
SQL> desc t;
 Name              Null?    Type
 ----------------- -------- ------------
 B                          NUMBER
 C                          NUMBER
 A                          NUMBER

--但是要注意如果插入数据:
insert into t values(1,2,3);
commit ;

SQL> select * from t;
         B          C          A
---------- ---------- ----------
         1          2          3

-- 实际上按照desc t显示的顺序,如果你看数据块,可以发现保持A,B,C的顺序。

SQL> @lookup_rowid AAAWk8AAJAAAACtAAA
    OBJECT       FILE      BLOCK        ROW DBA
---------- ---------- ---------- ---------- --------------------
     92476          9        173          0 9,173

SQL> alter system dump datafile 9 block 173 ;
System altered.

Block header dump:  0x024000ad
 Object id on Block? Y
 seg/obj: 0x1693c  csc: 0x00.28e176  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x24000a8 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.020.00000869  0x01402866.0111.21  --U-    1  fsc 0x0000.0028e177
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x024000ad
data_block_dump,data header at 0x179d6064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x179d6064
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f8c
avsp=0x1f78
tosp=0x1f78
0xe:pti[0]    nrow=1    ffs=0
0x12:pri[0]    ffs=0x1f8c
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x1  cc: 3
col  0: [ 2]  c1 04
col  1: [ 2]  c1 02
col  2: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 3 file#: 9 minblk 173 maxblk 173

SQL> select dump(A,16) c20 ,dump(b,16) c20,dump(c,16) c20 from t ;
C20                  C20                  C20
-------------------- -------------------- --------------------
Typ=2 Len=2: c1,4    Typ=2 Len=2: c1,2    Typ=2 Len=2: c1,3
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-766892/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2455
  • 访问量
    6258602