[20210421]12c以上版本增加欄位與預設值.txt

lfree發表於2021-04-22

[20210421]12c以上版本增加欄位與預設值.txt

--//昨天在最佳化sql語句時,發現過濾條件有點奇怪,才發現是12c以上增加欄位與預設值導致的情況。
--//今天測試各種增加欄位的情況。

1.環境:
TTT@192.168.2.7:1521/orcl> @ prxx
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 18.0.0.0.0
BANNER                        : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
BANNER_LEGACY                 : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.測試:

create table t (a number);
insert into t select rownum from dual connect by rownum <=3;
commit;
--//分析略。
alter table t add ( b number default 1 );
alter table t add ( c number default 2 not null);
alter table t add ( d number );
alter table t add ( e number default on null 4);
--//注:我所知道就這麼4種,也許還有其它方式。
alter table t add ( f number default 5 );

TTT@192.168.2.7:1521/orcl> @desc t
   Name  Null?    Type
   ----- -------- --------
1  A              NUMBER
2  B              NUMBER
3  C     NOT NULL NUMBER
4  D              NUMBER
5  E     NOT NULL NUMBER
6  F              NUMBER

TTT@192.168.2.7:1521/orcl> select OBJECT_ID,DATA_OBJECT_ID from dba_objects where object_name='T';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
    252156         252156

TTT@192.168.2.7:1521/orcl> select TABOBJ#,COLNUM,BINARYDEFVAL,GUARD_ID from sys.ecol$ a;
     TABOBJ#       COLNUM BINARYDEFVAL                       GUARD_ID
------------ ------------ ------------------------------ ------------
      252156            3 C102                                      0
      252156            6 C105
      252156            4 C103
      252156            7 C106                                      1
--//guard_id表示順序。

SELECT obj#
        ,col#
        ,segcol#
        ,INTCOL#
        ,name
        ,default$
        ,null$
        ,type#
        ,PROPERTY
    FROM sys.col$
   WHERE obj# IN (SELECT object_id
                    FROM dba_objects
                   WHERE owner = 'TTT' AND object_name = 'T')
ORDER BY INTCOL#;

  OBJ# COL# SEGCOL# INTCOL# NAME        DEFAULT$ NULL$ TYPE#     PROPERTY
------ ---- ------- ------- ----------- -------- ----- ----- ------------
252156    1       1       1 A                        0     2            0
252156    0       2       2 SYS_NC00002              0    23 549755814176
252156    2       3       3 B           1            0     2   1073741824
252156    3       4       4 C           2            1     2   1073741824
252156    4       5       5 D                        0     2            0
252156    5       6       6 E           4            1     2  69793218560
252156    6       7       7 F           5            0     2   1073741824
7 rows selected.

--//順便說明COL#,SEGCOL#,INTCOL#關係。
--// SEGCOL# 表示在資料段的儲存順序,按照 A,SYS_NC00002$,B,C,D,E,F.
--// INTCOL# 表示定義表時的定義欄位的順序,這裡與SEGCOL#順序一致,有時候會出現不一致的情況,比如IOT表,其主鍵在資料塊儲存中在
--// 最前面。
--// col# 不等於0的列顯示。換一句話將0表示隱含列。按照select * from t的欄位顯示順序.
--//可以參考
--//12c有一個新特性隱藏列,這樣就可以改變顯示順序,大家可以自行探究。

--//似乎以下兩個是很類似,PROPERTY不同。e欄位可以插入null,實際上進入插入的是4.
--//69793218560=1000001000000000000000000000000000000(二進位制)
--//1073741824 =      1000000000000000000000000000000(二進位制)
alter table t add ( c number default 2 not null);
alter table t add ( e number default on null 4);

TTT@192.168.2.7:1521/orcl> insert into t (a ) values (4);
1 row created.

insert into t (a,e ) values (5,NULL);

TTT@192.168.2.7:1521/orcl> commit ;
Commit complete.

TTT@192.168.2.7:1521/orcl> select t.*,SYS_NC00002$ c10  from t ;
 A  B  C  D  E  F C10
-- -- -- -- -- -- ----
 1  1  2     4  5
 2  1  2     4  5
 3  1  2     4  5
 4  1  2     4  5 03
 5  1  2     4  5 03
--//A=5對應的E=4,即使插入是NULL.

TTT@192.168.2.7:1521/orcl> @ dpc '' advanced
...
Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "T"."A"[NUMBER,22],
       "SYS_NC00002$"[RAW,126],
       DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00002$",0)),NULL,NVL("T"."B",1),'0',NVL("T"."B",1),'1',"T"."B")[22],
       NVL("T"."C",2)[22],
       "T"."D"[NUMBER,22],
       NVL("T"."E",4)[22],
       DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00002$",1)),NULL,NVL("T"."F",5),'0',NVL("T"."F",5),'1',"T"."F")[22]


3.看看塊的轉儲情況:
TTT@192.168.2.7:1521/orcl> select rowid,t.*,SYS_NC00002$ c10  from t ;
ROWID               A  B  C  D  E  F C10
------------------ -- -- -- -- -- -- ----
AAA9j8AAMAAAACHAAA  1  1  2     4  5
AAA9j8AAMAAAACHAAB  2  1  2     4  5
AAA9j8AAMAAAACHAAC  3  1  2     4  5
AAA9j8AAMAAAACHAAE  4  1  2     4  5 03
AAA9j8AAMAAAACHAAF  5  1  2     4  5 03

TTT@192.168.2.7:1521/orcl> @ rowid AAA9j8AAMAAAACHAAA
      OBJECT         FILE        BLOCK          ROW ROWID_DBA            DBA                  TEXT
------------ ------------ ------------ ------------ -------------------- -------------------- ----------------------------------------
      252156           12          135            0  0x3000087           12,135               alter system dump datafile 12 block 135

TTT@192.168.2.7:1521/orcl> @ rowid_abs AAA9j8AAMAAAACHAAF TTT T
    OBJECT   FILE_ABS       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT
---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
    252156         41         12        135          5  0x3000087           12,135               alter system dump datafile 41 block 135
--//說明使用cdb資料庫,相對檔案號與絕對檔案號不同.    

TTT@192.168.2.7:1521/orcl> alter system dump datafile 41 block 135;
System altered.

--//檢查轉儲:
Block header dump:  0x03000087
 Object id on Block? Y
 seg/obj: 0x3d8fc  csc:  0x0000000058dc696b  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x3000080 ver: 0x01 opc: 0
     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0007.005.00012658  0x02400930.3209.19  --U-    2  fsc 0x0000.58dc6a4b
0x02   0x000a.001.0001bf15  0x02401532.6f2b.3b  --U-    1  fsc 0x0000.58dc6f3b
bdba: 0x03000087
data_block_dump,data header at 0x7f4851c0f064
===============
tsiz: 0x1f98
hsiz: 0x1e
pbl: 0x7f4851c0f064
     76543210
flag=--------
ntab=1
nrow=6
frre=-1
fsbo=0x1e
fseo=0x1f4a
avsp=0x1f33
tosp=0x1f35
0xe:pti[0]      nrow=6  offs=0
0x12:pri[0]     offs=0x1f86
0x14:pri[1]     offs=0x1f8c
0x16:pri[2]     offs=0x1f92
0x18:pri[3]     offs=0x1f74
0x1a:pri[4]     offs=0x1f5f
0x1c:pri[5]     offs=0x1f4a
block_row_dump:
tab 0, row 0, @0x1f86
tl: 6 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f8c
tl: 6 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 2]  c1 03
tab 0, row 2, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 2]  c1 04
tab 0, row 3, @0x1f74
tl: 2 fb: --HDFL-- lb: 0x1
tab 0, row 4, @0x1f5f
tl: 21 fb: --H-FL-- lb: 0x1  cc: 7
col  0: [ 2]  c1 05
col  1: [ 1]  03
col  2: [ 2]  c1 02
col  3: [ 2]  c1 03
col  4: *NULL*
col  5: [ 2]  c1 05
col  6: [ 2]  c1 06
tab 0, row 5, @0x1f4a
tl: 21 fb: --H-FL-- lb: 0x2  cc: 7
col  0: [ 2]  c1 06
col  1: [ 1]  03
col  2: [ 2]  c1 02
col  3: [ 2]  c1 03
col  4: *NULL*
col  5: [ 2]  c1 05
col  6: [ 2]  c1 06
end_of_block_dump
--//後面插入的記錄都寫盤了。

--//另外我在想是否開發應該瞭解這些增加欄位的優缺點。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2769203/,如需轉載,請註明出處,否則將追究法律責任。

相關文章