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

第一:需不需要压缩

第二:对第几列压缩

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

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

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索引不能压缩

转载于:https://www.cnblogs.com/zfox2017/p/7997993.html

转://Oracle 复合压缩索引场景及性能对比相关推荐

  1. oracle 频繁操作删除对索引的影响吗,清除Oracle中无用索引 改善DML性能

    DML性能低下,其中最严重的原因之一是无用索引的存在.所有SQL的插入,更新和删除操作在它们需要在每一行数据被改变时修改大量索引的时候会变得更慢. 许多Oracle 管理人员只要看见在一个SQL 查询 ...

  2. 【java学习】Arraylist和LinkedList使用场景与性能对比

    介绍 ArrayList LinkedList 使用场景对比 两个实例: 二分查找 插入元素 总结 介绍 List 的三个子类的特点: ArrayList 底层结构是数组,底层查询快,增删慢. Lin ...

  3. oracle复合索引列顺序,复合索引顺序选择性问题(一)

    索引是我们经常选择的数据表检索优化方案之一.其中,复合索引是我们经常选择的策略.那么,构建索引列的顺序上,有何种差异和需要注意的方面呢?下面我们通过实验来进行说明. 实验环境说明 准备数据表和实验环境 ...

  4. [Oracle] 一个通过添加本地分区索引提高SQL性能的案例

    今天接到同事求助,说有一个select query,在Oracle上要跑一分多钟,他希望能在5s内出结果,该sql如下: Select /*+ parallel(src, 8) */ distinct ...

  5. oracle全局索引改成本地索引,解析一个通过添加本地分区索引提高SQL性能的案例...

    该sql如下: Select  /*+ parallel(src, 8) */ distinct src.systemname as systemname ,  src.databasename as ...

  6. Oracle 基础篇 --- 索引选项

    2019独角兽企业重金招聘Python工程师标准>>> ###4.4 选项 ####4.4.1 唯一索引 确保每个索引值都是唯一的. 主键.唯一键与唯一索引的区别 一般,我们看到术语 ...

  7. 【Oracle】关于索引的那些事

    [Oracle]关于索引的那些事 关于索引的理解,举一个不是很恰当的例子,如果要在英汉字典查询'index',可以从第一页开始往后翻,一页一页查,知道查询到'index',也可以根据字典目录快速找到' ...

  8. 定时创建oracle索引,oracle数据库关于索引建立及使用的详细介绍

    索引的说明 索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,频繁的DML操作反而会引起大量的索引维护. 如果SQL语句仅访 ...

  9. Oracle中的索引

    文章目录 1.索引的说明 2.索引的目的 3.索引结构 3.1B树索引结构 3.2 位图索引结构 4.建立索引的方式 5.索引碎片问题 1.索引的说明 索引是与表相关的一个可选结构,在逻辑上和物理上都 ...

最新文章

  1. winform - FixedDialog
  2. Linux下安装二进制版mysql-8.0.15
  3. C#学习小记12实现一个接口
  4. sql 精读(四) 标准 SQL 中聚合分析功能示例
  5. latex中算法命令_比较Java 8中的命令式和功能性算法
  6. html读取servlet,简单html与servlet交互(HTML利用servlet读取txt)
  7. postman启动没反应_电脑主机开机但显示器没反应?检查这4个地方,2分钟内找出问题...
  8. SpringCloud工作笔记072---同一浏览器上不同标签页_tab页或者同一浏览器新开一个浏览器窗口也能实现单点登录_单点登录_localStorage_sessionStorage
  9. HTML img 标签的 alt 属性
  10. DropBlock正则化
  11. Error: Cannot find module 'chalk' 或Cannot find module 'semver'报错
  12. 工厂有库存的我司高价IMX377CQT-C回收IMX317CQC-C长期回收OV芯片
  13. 利用Google Earth Engine 下载遥感影像
  14. java action例子_实例——创建ActionForm Bean
  15. 制作ROS小车系列(一)——小车底盘制作(麦科勒姆轮地盘)
  16. Gradle sync failed: 句柄无效。 的解决方法
  17. 对Java枚举与静态变量扩展,以及异步回调处理思考
  18. Cloud-Platform 开源项目环境搭建及运行
  19. java sqlserver 插入数据_java中怎样向SQLserver中插入数据
  20. HTML标签 链接 CSS样式

热门文章

  1. 1155: 零起点学算法62——输出矩阵
  2. EXCEL中提取某行最后一个有效单元格数据
  3. 高端ERP软件市场漫谈:崇洋无罪 自重有理
  4. 手动实现SPring中的AOP(2)
  5. linux中多线程解析
  6. 如何统计网站用户的停留时间?
  7. 【sql】leetcode习题 (共 42 题)
  8. 火狐插件youdao word capturer无法删除。
  9. 【bzoj5064】B-number 数位dp
  10. 浏览器API location