[20150926]索引压缩问题.txt

[20150926]索引压缩问题.txt

--以前如果索引前缀重复值很多,我会选择索引压缩,这样减少磁盘空间占用,索引范围扫描也可以减少磁盘IO,虽然这样可能消耗一些
--CUP资源,感觉影响不大。

--看了链接感觉自己忽略一些问题,可能导致达不到预期效果。
--通过例子来说明:

1.建立测试环境:
SCOTT@test01p> @ver1

PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> create table t as select rownum id , cast('test' as varchar2(20)) name from dual connect by level<=2e5;
Table created.

SCOTT@test01p> insert into t  select * from t where id <=1e5;
100000 rows created.

SCOTT@test01p> commit ;
Commit complete.

2.建立索引看看:

SCOTT@test01p> create index i_t_id on t(id) pctfree 0;
Index created.

SCOTT@test01p> select index_name, leaf_blocks, blevel from dba_indexes where table_name='T';
INDEX_NAME           LEAF_BLOCKS     BLEVEL
-------------------- ----------- ----------
I_T_ID                       598          2

--如果这个时候我选择索引压缩看看。
SCOTT@test01p> alter index i_t_id rebuild compress 1;
Index altered.

SCOTT@test01p> select index_name, leaf_blocks, blevel from dba_indexes where table_name='T';
INDEX_NAME           LEAF_BLOCKS     BLEVEL
-------------------- ----------- ----------
I_T_ID                       688          2

--可以发现这种方式占用的磁盘空间反而变大。

3.实际上还可以通过分析索引确定选择压缩的前缀。

SCOTT@test01p> validate index i_t_id;
Index analyzed.

SCOTT@test01p> @i
    HEIGHT     BLOCKS NAME          LF_ROWS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_ROWS    BR_BLKS BR_ROWS_LEN BR_BLK_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN DISTINCT_KEYS
---------- ---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- ----------- --------------- -------------
         3        768 I_T_ID         300000        688     3300000       7996        687          3        8259       8032           0               0        200000

MOST_REPEATED_KEY BTREE_SPACE USED_SPACE   PCT_USED ROWS_PER_KEY BLKS_GETS_PER_ACCESS   PRE_ROWS PRE_ROWS_LEN OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
----------------- ----------- ---------- ---------- ------------ -------------------- ---------- ------------ -------------- ----------------
                2     5525344    5496340        100          1.5                 4.25     200020      2188081              0               12

--实际上执行@i ,就是查询index_stats视图,因为显示的原因,我分开执行了2次。
--OPT_CMPR_COUNT=0 ,索引压缩前缀是0,选择不压缩。

4.继续插入数据:
SCOTT@test01p> insert into t  select * from t where id <=1e5;
200000 rows created.

-- 这样id=1 - 1e5 的数据每个存在4条。

SCOTT@test01p> @i
    HEIGHT     BLOCKS NAME          LF_ROWS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_ROWS    BR_BLKS BR_ROWS_LEN BR_BLK_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN DISTINCT_KEYS
---------- ---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- ----------- --------------- -------------
         3       1280 I_T_ID         500000       1138     5500000       7996       1137          5       13555       8032           0               0        200000

MOST_REPEATED_KEY BTREE_SPACE USED_SPACE   PCT_USED ROWS_PER_KEY BLKS_GETS_PER_ACCESS   PRE_ROWS PRE_ROWS_LEN OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
----------------- ----------- ---------- ---------- ------------ -------------------- ---------- ------------ -------------- ----------------
                4     9139608    7701636         85          2.5                 4.75     200020      2188081              1                0

--这种情况下OPT_CMPR_COUNT=1,选择索引压缩才有效果。看看对比情况:

SCOTT@test01p> alter index i_t_id rebuild compress 1;
Index altered.

SCOTT@test01p> select index_name, leaf_blocks, blevel from dba_indexes where table_name='T';
INDEX_NAME           LEAF_BLOCKS     BLEVEL
-------------------- ----------- ----------
I_T_ID                       963          2

SCOTT@test01p> alter index i_t_id rebuild nocompress ;
Index altered.

SCOTT@test01p> select index_name, leaf_blocks, blevel from dba_indexes where table_name='T';
INDEX_NAME           LEAF_BLOCKS     BLEVEL
-------------------- ----------- ----------
I_T_ID                       995          2

--对比发现即使在这样的情况下,选择索引压缩获得的效益也非常小。不如不选择索引压缩。

5.12c 还支持Index Advanced Compression技术,我目前的测试环境还不支持:

SCOTT@test01p> alter index i_t_id rebuild compress advanced low;
alter index i_t_id rebuild compress advanced low
*
ERROR at line 1:
ORA-65451: Advanced index compression is not supported for tablespaces on this storage type.

--无法测试。

6.总结:
--总之索引压缩要在前缀重复值达到一定程度的情况下有效,而且如果存在许多许多单一的值的情况效果会非产差。
--像我前面的测试1e5+1 - 2e5 之间的值仅仅出现一次,这个因素直接影响了索引压缩效率。

时间: 2024-08-27 06:07:22

[20150926]索引压缩问题.txt的相关文章

DB2面向OLTP环境的物理数据库设计:数据和索引压缩

您可以通过使用内置在 DB2 for Linux, UNIX and Windows 数据库中的压缩功能来减少表.索引和备份映像的大小,从而减少数据所需的存储量. 表和索引通常包含重复信息.这种重复可能是单独或合并的列值,也可能是列值的共同前缀,或者是在 XML 数据中的重复模式.压缩方法可以使用短字符串或符号来代替重复的信息. 您可以使用一些压缩功能来减少存储表和索引功能所需的空间,同时也可以采用一些功能来确定压缩可以提供的节省.您还可以使用备份压缩来减少备份的大小. DB2 Version

[20171031]rman备份压缩模式.txt

[20171031]rman备份压缩模式.txt --//测试rman备份压缩模式,那种效果好,我记忆里选择medium在备份时间和备份文件大小综合考虑最佳. --//还是通过脚本测试: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ---------------------------

[20171202]关于函数索引的状态.txt

[20171202]关于函数索引的状态.txt --//我曾经在一篇贴子提到索引可以disable吗?链接: --//http://blog.itpub.net/267265/viewspace-2123537/ --//实际上仅仅函数索引能disable,为什么呢?实际上自己以前并不搞清楚实际上这个跟oracle使用函数的特殊性有关. --//如果一个表删除某个字段,对应的索引也会删除.如果定义的函数删除了,对应的函数索引呢?通过例子来说明问题: 1.环境: SCOTT@test01p> @

[20150304]唯一索引与阻塞.txt

[20150304]唯一索引与阻塞.txt --昨天帮别人定位一个唯一索引导致出现ora-00001的问题,实际上很简单,程序使用max(id)取得最大号,然后插入,这样的结果在业务 --高峰,出现阻塞或者ora-00001错误.我仅仅简单做一下跟踪很容易定位这个问题. --换一个角度,使用别的方法是否可行呢,自己做一个例子来验证看看. 1.建立测试环境: SCOTT@test> create table t as select rownum id,cast ( 'test' as varcha

[20150626]建立索引pctfree=0.txt

[20150626]建立索引pctfree=0.txt --昨天看了链接: https://richardfoote.wordpress.com/2015/06/25/quiz-time-why-do-deletes-cause-an-index-to-grow-up-the-hill-backwards/ --自己测试看看来解答问题,不知道是否正确:-) 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION    

[20130110]linux传输文件-tar+nc+各种压缩方式.txt

[20130110]linux传输文件-tar+nc+各种压缩方式.txt 以前在linux下传输文件,特别一些大文件以及很多小文件,我个人经常喜欢tar+nc的传输方式. 实际上很简单: 在A机器上执行:tar -cvzf - /data/orcl/users01.dbf | nc -l 55555 在B机器上执行:nc A_IP 55555 | tar xvzf - -C /tmp --注意:-czf 后面有一个-,我曾经忘记写,导致1个文件破坏(切记!!!).这样解压在B机器的/tmp目录

[20131013]索引部分数据.txt

[20131013]索引部分数据.txt 在实际的生产系统中,比如一个标识状态的字段,'0'的行很少,'1'以及其他值的行很多,一个通过特殊的函数索引,利用oracle索引不保存NULL的特性(注意如果索引2个字段,2个必须为NULL,索引才不会保存),索引仅仅为'0',减少索引的大小,实际上网上有许多的例子,正好别人问到,顺手写一个小例子: 1.建立测试例子: SCOTT@test01p> @ver BANNER                                         

[20130815]关于虚拟索引的问题.txt

[20130815]关于虚拟索引的问题.txt 虚拟索引建立并没有占用磁盘空间,主要用来评估建立的索引是否可用.但是存在一个问题,如果建立了这样的索引,dba如何知道目前数据库存在那些虚拟索引,做一个例子来说明: 1.建立测试环境: SQL> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edit

[20121015]探索索引-学习bbed.txt

[20121015]探索索引-学习bbed.txt 参考链接:http://www.adellera.it/blog/2009/05/24/order-keys-inside-index-blocks/ 1.探索索引 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Ent