摘要:今天为什么提到这个话题,出于一个偶然,一个同事在优化新开发的系统时向我请教如何添加复合压缩索引的问题。我总结了一下,问题有三。

第一:需不需要压缩

第二:对第几列压缩

第三:性能对比,选出最优

好,问题提出我们一一来解答一下

1.场景

在我的文章中经常会看到这个词,当然也可以不谈场景说技术,但我觉的那只是隔空建楼,毫无目的,没有根据性。我们在深入研究的时候要避免这样的盲目讨论,效果也不会好太多。注重技术的应用场景,才是研究技术、应用技术之根本,不管多么高科技的东东,或者说多牛的技术,最终还是要落到实处。那么本节讲的“复合压缩索引”的使用场景常用在,where子句中同时查询多列的情况下可以创建。如果要是有的列上数据重复度较高可以考虑进行压缩,重复度越高压缩效果越好,索引压缩以后一个索引块可以存放更多的键值。今天我们遇到的情况就和上述差不多。简介如下:

BB_BORROWER  表名,这是我们需要检索的表名

BB_BORROWER.VALIDITYFLAG  VARCHAR2(5)列名,数据有效状态,此列只有三个值“1”“2”“3”

特点:列的基数不多且重复值极高

BB_BORROWER.FINANCECODE  VARCHAR2(14)列名,金融机构代码,此列相对来讲基数略大,大到多少呢->1000家,这是征信管理局今年审批过的机构数,可能有的朋友会问,此列要不要压缩啊,实践是检验真理的唯一标准,经过测试后才能得到答案。

2.复合压缩索引语法

create index 索引名 on 表名(列名) compress  1;

compress后面跟的数字表示前缀的深度,也就是需要用来压缩的columns数

create index idx_leo on t(a,b,c) compress1;   只压缩第一列

create index idx_leo on t(a,b,c) compress2;   对前两列进行压缩

create index idx_leo on t(a,b,c) compress3;   对前三列进行压缩

3.查看动态性能视图指标

官方文档 books:Reference->INDEX_STATS

selectbtree_space,used_space,height,br_blks,lf_blks,opt_cmpr_count from index_stats;

btree_space:B-tree索引当前分配的空间

used_space:分配空间中已经被使用的部分

height:B-tree索引的高度(层数)

br_blks:B-tree索引的分支块数,分支块不能够被压缩

lf_blks:B-tree索引的叶子块数,叶子块能够被压缩

opt_cmpr_count:列中关键字最小的压缩长度

4.实验

(1)非压缩复合索引

drop index idx_bb_borrower1;

create index idx_bb_borrower1on bb_borrower(validityflag,financecode);

SQL> analyze index idx_bb_borrower1validate structure;             分析索引结构

Index analyzed

SQL> selectbtree_space,used_space,height,br_blks,lf_blks,opt_cmpr_count from index_stats;

BTREE_SPACE    USED_SPACE   HEIGHT   BR_BLKS    LF_BLKS     OPT_CMPR_COUNT

----------- -------------------- ---------- ---------- ------------------ -------------------- ---------- ---------- --------

7996     868                 1             0                1                 2

(2)只压缩第一列的复合压缩索引

SQL> drop index idx_bb_borrower1;

Index dropped

SQL> create index idx_bb_borrower1 onbb_borrower(validityflag,financecode) compress 1;

Index created

SQL> analyze index idx_bb_borrower1validate structure;          分析索引结构

Index analyzed

SQL> select btree_space,used_space,height,br_blks,lf_blks,opt_cmpr_countfrom index_stats;

BTREE_SPACE     USED_SPACE    HEIGHT    BR_BLKS    LF_BLKS         OPT_CMPR_COUNT

----------- ---------- -------------------- ---------- ---------------------- ---------- ---------- ------------------------

7992       830                  1               0               1                     2

(3)压缩前两列复合压缩索引

drop index idx_bb_borrower1;

create index idx_bb_borrower1 onbb_borrower(validityflag,financecode) compress 2;

SQL> drop index idx_bb_borrower1;

Index dropped

SQL> create index idx_bb_borrower1 onbb_borrower(validityflag,financecode) compress 2;

Index created

SQL> analyze indexidx_bb_borrower1 validate structure;          分析索引结构

Index analyzed

SQL> selectbtree_space,used_space,height,br_blks,lf_blks,opt_cmpr_count from index_stats;

BTREE_SPACE     USED_SPACE   HEIGHT    BR_BLKS   LF_BLKS      OPT_CMPR_COUNT

----------- ---------- -------------------- ---------- ---------------------- ---------- ---------- ------------------------

7992       571                 1               0               1                  2

最后分析表并级联索引

SQL> executedbms_stats.gather_table_stats('sfcp','bb_borrower',cascade=>true);

PL/SQL procedure successfully completed

附:如果索引之前已经创建完毕,rebuildindex可重建压缩索引&恢复为普通索引之方法

alterindex idx_bb_borrower1 rebuild compress;

alterindex idx_bb_borrower1 rebuild nocompress;

5.结论

我们现在对上述三个实验结果进行对比可发现“对前两列进行压缩”效果最好,如果表中记录越多,那么测试的效果越显著。

复合压缩索引优势

(1)对键值重复度越高的列压缩效果越好,可以节省更多的存储空间

(2)索引压缩后一个索引块可以存放更多的索引键值

(3)扫描同样的记录数物理IO更少

(4)提高缓冲区命中率

复合压缩索引不足

(1)索引更新时需要重新解压->更新->加压,使用更多的CPU资源,维护成本高

(2)索引查询时需要更多的CPU计算时长,解压后才能比较查询

(3)热块竞争,当查询的结果集都集中在一个块中时会引起热块

(4)争用更多的CPU资源

小结:索引压缩技术是否可以帮助提升总体性能,这就需要根据实际硬件资源来具体分析了。在IO资源与CPU资源之间做好取舍,经过实际测试后得出结论。由此看出,一种技术的使用必然离不开它所应用的场景,使用的效果也要根据当时的场景具体问题具体分析。

注:bitmap索引不能压缩

转://Oracle 复合压缩索引场景及性能对比的更多相关文章

  1. Oracle 分区表管理之组合分区(分区索引失效与性能比较)

    整体结构如下: Oracle  分区表管理之组合分区(分区索引失效与性能比较) 虽然老早就使用了分区表,终于有时间写有关分区表的内容:不是所有的场景数据量变大需要用到分区表,一般单表数据超过2g可以考 ...

  2. oracle提高之索引学习

    一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema ...

  3. ORACLE表、索引和分区详解

    ORACLE表.索引和分区 一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两 ...

  4. Oracle中的索引详解

    Oracle中的索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是 ...

  5. [转]Oracle中的索引详解

    原文地址:http://www.oschina.net/question/30362_4057 一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0- ...

  6. 【性能诊断】二、单功能场景的性能分析(fiddler、SQL Profiler)

    Fiddler fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测 ...

  7. ORACLE Index Lookup索引访问路径总结

    在ORACLE中,索引访问/查找(Index Lookup)路径有五种方式,分别为INDEX UNIQUE SCAN.INDEX RANGE SCAN.INDEX FULL SCAN.INDEX FA ...

  8. Oracle中的索引详解(转载)

    一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, last_name ...

  9. 索引笔记《一》Oracle中的索引详解

    一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, last_name ...

随机推荐

  1. 汇编语言--微机CPU的指令系统(五)(字符串操作指令)

    (11)字符串操作指令 字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的.字符串操作指令可对内存单元按字节.字或双字进行处理,并能根据操作对象的 ...

  2. idea代码快捷

    idea代码快捷:main函数快捷:psvmfor循环快捷:fori.foreach系统输出快捷:sout.serr 更多的提示可以按Ctrl+ J 进行查看 更改快捷:File-->Setti ...

  3. PS换脸操作

    1,使用套索工具抠出人的五官. 2,Ctrl+C复制黏贴到另一张头像中,调节透明度50%,与需要换脸的头像的眼睛,嘴巴,鼻子重合,透明度回归100%. 3,为了不该变原图,需要新建一张原图. 4,在抠 ...

  4. laravel5.1 ajax post传值_token

    laravel框架中只要是涉及到post传值都需要传 _token ,这是框架中为了防止crsf攻击所做的安全措施,那么我们用到ajax中的post 方式传值时,也需要在所传数据中添加一个_token ...

  5. phpcms导航菜单的写法

    PHP打印方法: {php print_r(变量);} <?php print_r(变量);?> 1. <div class="webnav"> {pc:g ...

  6. RabbitMQ 消息流程、AMOP 概念

    AMOP Server:Broker.RabbitMQ Server,实现 AMOP 实体服务,接受客户端的连接 Conneciton:链接,应用程序与 Server 的网络连接 Channel:网络 ...

  7. Linux Linux下最大文件描述符设置

    Linux下最大文件描述符设置 by:授客 QQ:1033553122 1.   系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...

  8. Android为TV端助力 清除本应用里的各种数据的方法

    public class DataCleanManager { /** * * 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) * * * * @param conte ...

  9. Kotlin入门(29)任务Runnable

    任务Runnable定义了一个可以独立运行的代码片段,通常用于界面控件的延迟处理,比如有时为了避免同时占用某种资源造成冲突,有时则是为了反复间隔刷新界面从而产生动画效果.运行一个任务也有多种形式,既可 ...

  10. [Objective-C]编程艺术 笔记整理

    看了<禅与 Objective-C 编程艺术>,发现不少平时不注意的或注意但没有系统总结的东西,特此记录一下. 这次没有整理完,后续更新会结合手里的一些其他资料整理. 新博客wossone ...