位图索引

同样的,先说是什么,再说为什么。

上篇我们说过BTREE索引是将数据表的索引列和行号排序后以树状形式存在磁盘中。那位图索引是什么样的呢?

现有如下日志表,有操作类型字段op_type,该字段的取值只有“查看”、“查询”、“新增”、“修改”和“删除”。

如下表,当在op_type列建位图索引,如果某数据行取值是“查看”则将该行的“查看”的单元格记为1,在其他取值上记0;如果取值是“修改”则在该行的“修改”的单元格记1,其他取值上记0:

同理,在操作用户列建位图索引如下:

查看如下计数语句在各种情况下的效率如何呢?

select count(*) from tsys_log_click;

未建索引:

建了BTREE索引:

在操作类型op_type列上建位图索引之后:

我们在不同前提下进行了三次统计查询,在未建索引的情况下,统计查询走的全表扫描,代价是223,逻辑读是838;在非空列r_id上建BTREE索引之后,统计查询走的索引快速扫描,代价是46,逻辑读是193;在操作类型列上建位图索引之后,统计查询走的位图索引快速扫描,代价是3,逻辑读是7。

所以,在统计查询中,代价最高的是全表扫描;在非空列上建BTREE索引后,一般走BTREE索引的效率要比全表扫描高;最快的是在列取值高度重复的列上建位图索引。

BTREE索引存储的是列值,而位图索引存储的是比特位值,加入位图索引所在的列只有一个取值,比如操作类别列只有“查看”,这时整个位图索引的大小大致等于行数乘以这1个字节,如果操作类型有“查看”和“查询”,最多也就是只有“查看”的情况下的两倍大,所以位图索引在重复度很低时,体积非常小,所以count(*)统计非常快。

当我们在做

where op_type = '删除' and call_user = 'xrisk'

这样的即席查询时,如果在条件列上建了位图索引,那么查询其实就是个逻辑运算,在我们上面两张表中,找出这两列的取值都为1(与运算)的结果就是了。

但是建了位图索引的数据表,在更新数据时会有很大的问题:

当位图索引列的取值越少,更新数据时,维护索引影响的列数就越多,比如操作类别列如果取值只有“查看”和“查询”的话,键值为“查看”的索引条目指向了数据库一半以上的数据,更新就要影响了一半以上的数据。

所以,如果某列是被频繁更新的,或者频繁插入记录的表,建位图索引是不合适的。上面还有一条,这个列的取值是高度重复的,否则我们像上面构建的位图索引的所谓的表也会很庞大。

函数索引

如果对索引列做运算会导致索引无法使用:

select * from tsys_log_click where upper(call_user) = 'TOM';

即使在call_user列上建了索引,这样的查询也不会走索引。但我们可以连带着函数一起建索引,即函数索引:

函数索引的性能是在全表扫描和普通索引之间

所以应该尽可能避免函数索引。例如

select * from tsys_user where substr(user_name,1,3) = 'Tom';

可以改写成 select * from tsys_user where user_name like 'Tom%';

Oracle中的位图索引和函数索引的更多相关文章

  1. Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?

    Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程?   麦苗答:方法有多种,可以使用DBMS_MET ...

  2. oracle的位图索引和函数索引

    1.位图索引 位图索引适用于性别.婚姻状态.行政区等只有几列固定值的类型列,身份证号等就不适合位图索引,位图索引适用于静态数据,频繁更新的字段不适用建立位图索引,因为更新会导致索引块区的变更,还会引起 ...

  3. ORACLE中的支持正则表达式的函数

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  4. Oracle 中的 TO_DATE 和 TO_CHAR 函数

    Oracle 中的 TO_DATE 和 TO_CHAR 函数oracle 中 TO_DATE 函数的时间格式,以 2008-09-10 23:45:56 为例 格式 说明 显示值 备注 Year(年) ...

  5. 【转】Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理

    Oracle 中的 TO_DATE 和 TO_CHAR 函数oracle 中 TO_DATE 函数的时间格式,以 2008-09-10 23:45:56 为例 格式 说明 显示值 备注 Year(年) ...

  6. oracle中类似indexof用法_instr函数

    oracle中类似indexof用法_instr函数 [sql] 在oracle中没有indexof()函数 但是提供了一个 instr() 方法 具体用法: select instr('保定市南市区 ...

  7. mysql中sql语句中常见的group_concat()函数意思以及用法,oracle中与其一样的功能函数是wmsys.wm_concat()

    1.group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一 ...

  8. Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理

    Oracle 中的 TO_DATE 和 TO_CHAR 函数 oracle 中 TO_DATE 函数的时间格式,以 :: 为例 格式 说明 显示值 备注 Year(年): yy two digits( ...

  9. oracle中的创建过程,函数,包

    一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命 ...

随机推荐

  1. CS(计算机科学)知识体

    附 录 A                   CS( 计算机科学)知识体 计算教程 2001 报告的这篇附录定义了计算机科学本科教学计划中可能讲授的知识领域.该分类方案的依据及其历史.结构和应用的其 ...

  2. js canvas游戏初级demo-上下左右移动

    大概流程就是监听状态变化擦除画布重绘 由于js监听时间变化的函数addEventListener只能达到每秒触发20次左右,也就是每秒20帧,看起来有点卡卡的 所以用定时器搞到每秒30帧 按上下左右键 ...

  3. [dev][go] 入门Golang都需要了解什么

    一 什么是Golang 首先要了解Golang是什么. Golang是一门计算机编程语言:可以编译成机器码的像python一样支持各种特性的高级语言. 由Google发明,发明人之一是K,就是C语言的 ...

  4. docker安装,err:exit status 255,提示找不到虚拟机IP

    我遇到这个问题是因为,BIOS没有打开虚拟化技术,导致虚拟机无法成功创建,自然找不到IP. 解决: 1.进入BIOS,高级选项卡下,找到虚拟化技术开关,打开即可.具体做法,可搜网文. 2.删除原来自动 ...

  5. Linux自动化命令工具expect

    expect是Unix系统中用来进行自动化控制和测试的软件工具,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等. 用法 Linux中我们经常写脚本处 ...

  6. tensorflow 基本内容

    tensorflow的结构 1.使用图(graphs)来表示计算任务 2.在被称之为会话(Session)的上下文(context)中执行图 3.使用tensor表示数据 4.通过变量(Variabl ...

  7. 学习记录----简单的原生js路由

    在以前的web程序中,路由字眼只出现在后台中.但是随着SPA单页面程序的发展,便出现了前端路由一说.单页面顾名思义就是一个网站只有一个html页面,但是点击不同的导航显示不同的内容,对应的url也会发 ...

  8. TCP/IP 免费ARP

    免费ARP Gratuitous ARP也称为免费ARP.Gratui ARP不同于一般的ARP请求,它并非期待得到IP对应的MAC地址,而是当主机启动的时候,将发送一个Gratuitous arp请 ...

  9. 牛客随笔(c++)

    1.关于指针的字节大小: 当为32位系统时大小为4字节,64位系统时大小为8字节: #include<iostream> using namespace std; int main() { ...

  10. SWIT2019无线通信和信息技术国际研讨会(上海)

    无线通信和信息技术国际研讨会(SWIT 2019)将于2019年6月29日至30日在中国上海皇冠晶品酒店举行.本次会议将讨论无线通信和信息技术问题.它致力于创造一个交流最新研究成果和分享先进研究方法的 ...