zoukankan      html  css  js  c++  java
  • Oracle

    生活案例

    排序对检索来说是非常重要的,乱序的话,也就无所谓什么快速检索了。
    我们思考一个问题:我们有一堆的球,编号按照从小到大排序,有中、大、小3种型号,我们如何快速找到所有的大球?

    1、Range分区

    大球1个分区,中球1个分区,小球1个分区。如果是考试,回答看起来不得分,实际应用中,有一定参考价值。
    (这样不好是因为还要考虑分区容量)

    2、位图

    前面说了,编号按照从小到大排序,我们首先想到平衡树,
    0-m放一堆,m-n放一堆,n-MAX放一堆。

    假设第一堆有8个球,2个大球,2个中球,4个小球。
    大球记为1,非大球记为0,得出一串二级制数,1100 0000;
    中球记为1,非中球记为0,得出一串二级制数,0011 0000;
    小球记为1,非小球记为0,得出一串二级制数,0000 1111。

    我们要找大球,只要看1100 0000这个数字,前面2个是1,所以前面2个球是大球;
    我们要找大球或者中球, 1100 0000 与 0011 0000 “按位与” 运算,得出 1111 0000,就能看出,前面4个球满足条件。

    总结

    通过这个案例,再看Oracle中的位图索引
    1、如果字段只有几个固定的值,比如 “男“、”女”,就很适合创建位图索引;
    2、案例提到了“顺序”,Oracle实际上用的是RowId,不需要我们额外排序;
    3、如果第一个球漏气,变成小球怎么办?我们要改动1100 0000这一串值,然后还得改动0000 1111这一串值,
    这个期间,另一个人也想改数据,这显然会出问题,所以,1个人改的时候,前面8个球都要锁定,
    更新1行记录,一下子锁定了8行记录,可见Bitmap更新的成本非常高,因此,Oracle不推荐在频繁更新的场合,使用位图索引

    拓展 

    1、这个案例,实际上应用的是“平衡树 + 位图”,“矩阵 + 位图” 也有很多应用场景。

    2、大中小3种型号,我们创建了3个位图,3个位图是不是还可以考虑合并一下?(可以参考图像处理,这里不展开了) 

    疯狂的妞妞 :每一天,做什么都好,不要什么都不做……
  • 相关阅读:
    SpringMVC学习笔记----
    各种语言学习
    七步精通Python机器学习 转
    开源GIS有用
    sql 语句
    调试windows服务最简单的方法之一
    sqlserver2008 win7下安装 windows installer错误
    高德地图AmapSDKDemo运行
    google mapsDemo示例运行
    android开发环境搭建遇到的问题
  • 原文地址:https://www.cnblogs.com/chenss15060100790/p/15062424.html
Copyright © 2011-2022 走看看