[20181127]12c Advanced Index Compression 2.txt
[20181127]12c Advanced Index Compression 2.txt
--//重複連結測試:
1.環境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
-------------------- ---------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
SCOTT@test01p> create table bowie (id number, code number, name varchar2(30));
Table created.
SCOTT@test01p> insert into bowie select rownum, rownum, 'ZIGGY STARDUST' from dual connect by level <= 1000000;
1000000 rows created.
--//修改大部分資料導致出現重複值.
SCOTT@test01p> update bowie set code = 42 where id between 250000 and 499999;
250000 rows updated.
SCOTT@test01p> commit ;
Commit complete.
SCOTT@test01p> create index bowie_code_i on bowie(code);
Index created.
SCOTT@test01p> alter index bowie_code_i rebuild compress advanced low;
Index altered.
SCOTT@test01p> select index_name, leaf_blocks, compression from user_indexes where table_name='BOWIE';
INDEX_NAME LEAF_BLOCKS COMPRESSION
-------------------- ----------- -------------
BOWIE_CODE_I 2054 ADVANCED LOW
--//前面已經測試過,採用compress advanced low;後,比原來的普通字首壓縮更小.簡單探究Advanced Index Compression的索引結構.
2.測試:
SCOTT@test01p> select object_id,data_object_id,object_name from user_objects where object_name='BOWIE_CODE_I';
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- --------------------
73219 73223 BOWIE_CODE_I
SCOTT@test01p> @ treedump BOWIE_CODE_I
old 1: select object_id from user_objects where object_name = upper('&&1') and object_type = 'INDEX'
new 1: select object_id from user_objects where object_name = upper('BOWIE_CODE_I') and object_type = 'INDEX'
OBJECT_ID
----------
73219
old 1: alter session set events 'immediate trace name treedump level &m_index_id'
new 1: alter session set events 'immediate trace name treedump level 73219'
Session altered.
--//檢查轉儲檔案.
----- begin tree dump
branch: 0x2c0113b 46141755 (0: nrow: 4, level: 2)
branch: 0x2c013b4 46142388 (-1: nrow: 544, level: 1)
leaf: 0x2c0113c 46141756 (-1: row:618.618 avs:820 Acmp:42.1.2)
leaf: 0x2c0113d 46141757 (0: row:651.651 avs:826 Acmp:1.1.2)
leaf: 0x2c0113e 46141758 (1: row:651.651 avs:826 Acmp:1.1.2)
leaf: 0x2c0113f 46141759 (2: row:651.651 avs:826 Acmp:1.1.2)
leaf: 0x2c01140 46141760 (3: row:651.651 avs:826 Acmp:1.1.2)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
leaf: 0x2c01141 46141761 (4: row:651.651 avs:826 Acmp:1.1.2)
...
leaf: 0x2c01310 46142224 (382: row:651.651 avs:826 Acmp:1.1.2)
leaf: 0x2c01311 46142225 (383: row:488.488 avs:828 Acmp:0.0.2)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
leaf: 0x2c01312 46142226 (384: row:479.479 avs:816 Acmp:0.0.2)
--//你可以發現下劃線相關資料塊,塊中索引鍵值很多.選擇其中1塊轉儲看看(dba=0x2c0113e 46141758)
--//46141758= alter system dump datafile 11 block 4414
--//46142225= alter system dump datafile 11 block 4881
SCOTT@test01p> alter system dump datafile 11 block 4414;
System altered.
SCOTT@test01p> alter system dump datafile 11 block 4881;
System altered.
3.分析轉儲檔案:
Block header dump: 0x02c0113e
Object id on Block? Y
seg/obj: 0x11e07 csc: 0x0000000000181654 itc: 2 flg: E typ: 2 - INDEX
brn: 0 bdba: 0x2c01138 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000000000181654
Leaf block dump
===============
header address 615067748=0x24a93064
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0xa0: opcode=0: iot flags=-C- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 651
kdxcofbo 1346=0x542
kdxcofeo 2172=0x87c
kdxcoavs 826
kdxlespl 0
kdxlende 0
kdxlenxt 46141759=0x2c0113f
kdxleprv 46141757=0x2c0113d
kdxledsz 0
kdxlebksz 8036
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kdxlepnro 1
kdxlepnco 1 (Adaptive)
prefix row#0[8031] flag: -P-----, lock: 0, len=5
col 0; len 2; (2): c1 2b
prc 651
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
row#0[8022] flag: -------, lock: 0, len=9
col 0; len 6; (6): 02 c0 04 87 00 11
psno 0
row#1[8013] flag: -------, lock: 0, len=9
col 0; len 6; (6): 02 c0 04 87 00 12
psno 0
...
row#648[2190] flag: -------, lock: 0, len=9
col 0; len 6; (6): 02 c0 04 89 00 b5
psno 0
row#649[2181] flag: -------, lock: 0, len=9
col 0; len 6; (6): 02 c0 04 89 00 b6
psno 0
row#650[2172] flag: -------, lock: 0, len=9
col 0; len 6; (6): 02 c0 04 89 00 b7
psno 0
----- end of leaf block Logical dump -----
----- end of leaf block dump -----
End dump data blocks tsn: 5 file#: 11 minblk 4414 maxblk 4414
kdxlepnro 1
kdxlepnco 1 (Adaptive)
prefix row#0[8031] flag: -P-----, lock: 0, len=5
col 0; len 2; (2): c1 2b
prc 651
--//引用:
The red section is a portion of the index header that determines the number of rows in the prefix table of the index
(kdxlepnro 1). The prefix table basically lists all the distinct column values in the leaf blocks that are to be
compressed. The value 1 denotes there is actually only just the 1 distinct column value in this specific leaf block
(i.e. all index entries have the same indexed value). This section also denotes how many of the indexed columns are to
be compressed (kdxlepnco 1). As this index only has the one column, it also has a value of 1. Note this value can
potentially be anything between 0 (no columns compressed) up to the number of columns in the index. The (Adaptive)
reference tells us that Index Advanced Compression has been used and that the values here can change from leaf block to
leaf block depending on the data characteristics of the index entries within each leaf block (a dump of a basic
compressed index will not have the "Adaptive" reference).
The green section is the compression prefix table and details all the unique combinations of index entries to be
compressed within the leaf block. As all indexed values are the same in this index (value 42, internally represented as
c1 2b hex), the prefix table only has the one row. prc 651 denotes that all 651 index entries in this leaf block have
this specific indexed value.
Next follows all the actual index entries, which now only consist of the rowid (the 6 byte col 0 column) as they all
reference psno 0, which is the unique row id of the only row within the prefix table (row#0).
So rather than storing the indexed value 651 times, we can just store the index value (42) just the once within the
prefix table and simply reference it from within the actual index entries. This is why index compression can save us
storage, storing something once within a leaf block rather than multiple times.
If we now look at a partial block dump of another index leaf block within the index, that consists of many differing
(basically unique) index entries:
Block header dump: 0x02c01311
Object id on Block? Y
seg/obj: 0x11e07 csc: 0x0000000000181654 itc: 2 flg: E typ: 2 - INDEX
brn: 0 bdba: 0x2c01300 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000000000181654
Leaf block dump
===============
header address 615067748=0x24a93064
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0xa0: opcode=0: iot flags=-C- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 488
kdxcofbo 1016=0x3f8
kdxcofeo 1844=0x734
kdxcoavs 828
kdxlespl 0
kdxlende 0
kdxlenxt 46142226=0x2c01312
kdxleprv 46142224=0x2c01310
kdxledsz 0
kdxlebksz 8036
kdxlepnro 0
kdxlepnco 0 (Adaptive)
row#0[8024] flag: -------, lock: 0, len=12
col 0; len 2; (2): c1 2b
col 1; len 6; (6): 02 c0 08 ff 00 97
--//還有小部分資料是42的鍵值.
row#1[8012] flag: -------, lock: 0, len=12
col 0; len 2; (2): c1 2b
col 1; len 6; (6): 02 c0 08 ff 00 98
row#2[8000] flag: -------, lock: 0, len=12
col 0; len 2; (2): c1 2b
col 1; len 6; (6): 02 c0 08 ff 00 99
row#3[7988] flag: -------, lock: 0, len=12
col 0; len 2; (2): c1 2b
col 1; len 6; (6): 02 c0 08 ff 00 9a
...
row#90[6944] flag: -------, lock: 0, len=12
col 0; len 2; (2): c1 2b
col 1; len 6; (6): 02 c0 08 ff 00 f1
row#91[6932] flag: -------, lock: 0, len=12
col 0; len 2; (2): c1 2c
col 1; len 6; (6): 02 c0 00 ae 00 2a
...
row#481[1922] flag: -------, lock: 0, len=13
col 0; len 3; (3): c2 05 22
col 1; len 6; (6): 02 c0 00 af 00 a6
row#482[1909] flag: -------, lock: 0, len=13
col 0; len 3; (3): c2 05 23
col 1; len 6; (6): 02 c0 00 af 00 a7
row#483[1896] flag: -------, lock: 0, len=13
col 0; len 3; (3): c2 05 24
col 1; len 6; (6): 02 c0 00 af 00 a8
row#484[1883] flag: -------, lock: 0, len=13
col 0; len 3; (3): c2 05 25
col 1; len 6; (6): 02 c0 00 af 00 a9
row#485[1870] flag: -------, lock: 0, len=13
col 0; len 3; (3): c2 05 26
col 1; len 6; (6): 02 c0 00 af 00 aa
row#486[1857] flag: -------, lock: 0, len=13
col 0; len 3; (3): c2 05 27
col 1; len 6; (6): 02 c0 00 af 00 ab
row#487[1844] flag: -------, lock: 0, len=13
col 0; len 3; (3): c2 05 28
col 1; len 6; (6): 02 c0 00 af 00 ac
----- end of leaf block Logical dump -----
----- end of leaf block dump -----
End dump data blocks tsn: 5 file#: 11 minblk 4881 maxblk 4881
We notice that in the red section, both kdxlepnro 0 and kdxlepnco 0 (Adaptive) have a value of 0, meaning we have no
rows and no columns within the prefix table. As such, we have no prefix table at all here and that this leaf block has
simply not been compressed.
If we look at the actual index entries, they all have an additional column now in blue, that being the actual indexed
value as all the index values in this leaf block are different from each other. Without some form of index entry
duplication, there would be no benefit from compression and Index Advanced Compression has automatically determined this
and not bothered to compress this leaf block. An attempt to compress this block would have actually increased the
necessary overall storage for these index entries, due to the additional overheads associated with the prefix table
(note it has an additional 2 byes of overhead per row within the prefix table).
I'll next look at an example of a multi-column index and how Index Advanced Compression handles which columns in the
index to compress.
--//注:下面將探究多列採用Advanced index Compression 的情況.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2221716/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20181127]12c Advanced Index Compression.txtIndex
- Advanced Index CompressionIndex
- Oracle Database Compression 2 - Advanced/OLTP CompressionOracleDatabase
- [20190311]12cR2 Advanced index compression.txtIndex
- Oracle 11g Advanced Compression(上)Oracle
- Oracle 11g Advanced Compression(下)Oracle
- Oracle Index Key Compression索引壓縮OracleIndex索引
- [20231027]Index ITL Limit 2.txtIndexMIT
- Oracle Database Compression 1 - Basic CompressionOracleDatabase
- Unused Block Compression和Null Block CompressionBloCNull
- Oracle Database Compression 3 - Hybrid Columnar CompressionOracleDatabase
- [20170726]11G 12c expand sql text 2.txtSQL
- [20190911]12c dml redo優化2.txt優化
- [20181026]12c Attribute Clustering特性2.txt
- Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHEDOracleIndexBAT
- [20220422]完善tpt ash ash_index_helperx指令碼2.txtIndex指令碼
- Encoder Data compression
- [20120730]11g下Oracle Index rebuild online之2.txtOracleIndexRebuild
- mysql 5.7 Transparent PageIO CompressionMySql
- Oracle Advanced SecurityOracle
- ffmpeg Advanced options
- LZ4 compression algorithm on FPGAGoFPGA
- MySQL5.7 InnoDB Page CompressionMySql
- What’s new in Cassandra 1.0: Compression
- [20130815]12c Asynchronous Global Index Maintenance Part II.txtIndexAINaN
- [20130815]12c Asynchronous Global Index Maintenance Part III.txtIndexAINaN
- [20130916]12c Indexing Extended Data Types and index.txtIndex
- Cerbero Suite Advanced 5UI
- AIX(Advanced Interactive eXecutive)AI
- Availability and Compression of Free Space in a Data BlockAIBloC
- MODEL COMPRESSION VIA DISTILLATION AND QUANTIZATION翻譯
- KEEP INDEX | DROP INDEXIndex
- Metasploit advanced命令使用技巧
- Advanced-react-patterns(2)React
- Swift 4 Cheat Sheet AdvancedSwift
- DBMS_ADVANCED_REWRITE and DML
- ch10_oop_advancedOOP
- rowid,index,INDEX FULL SCAN,INDEX FAST FULL SCAN|IndexAST