Oracle关于位图索引的创建与应用

机器人强化学习入门学习笔记 如果你追求高精度动力学仿真、用于强化学习或机器人研究,MuJoCo 是一个非常优秀的选择。如果需要快速实验、使用真实机器人模型,PyBullet 或 Gazebo可能更合适;如果你追求大规模并行训练,Isaac Gym 或 BraX会更高效。legged gym底层是​编辑isaacgym,基于gpu训练可以多环境并行训练,收敛到一个稳定行走的策略快。本视频MuJoCo基于cpu训练很慢。 阅读详情
 

Oracle关于位图索引的创建与应用

标签: Oracle 位图索引
3730人阅读  评论(0)  收藏  举报
  分类:
 
1)创建

  CREATE BITMAP INDEX index_name ON normal_index_creation_clause;

  Oracle创建一系列的位图,每个位图都与一个特殊的值有关。例如,如果在某一个字段上创建一个位图索引,这个字段上的值有2种,1个是'East'1个是'Central',那没就建立有2个位图,1个用于'East'1个用于'Central'。


  如果索引建立于多个字段上,那么每种可能的组合都必须有一个位图。


  2)位图索引结构

  一个规则的B*tree索引是根据ROWID作为行的关键值来成对,再将这些对整理放置到B*tree结构中。ROWID作为一个指向一行的指针。位图索引有一个非常不一样的结构:ROWID并不直接存储:每个不同的值有一个它们自己的位图。(这就是为什么位图索引通常建立在独特值较少的列上)。


  位图的每个位置映射到一个可能的ROWID上,位图上每个位置的内容用于表示该行特定的值是否在位图列中。所以,位图的每个位置存储特殊行和相关ROWID的信息。如果该ROWID的行的值匹配,则该特殊rowid位置存储为"1",否则储存为"0"。Oracle也能够压缩位图存储。


  3)何时使用位图索引


  - 该字段具有较低的集的势:独特值较少


  - 位图索引在具有冗长WHERE条件的复杂查询或聚合查询(包含SUM,COUNT或其他聚合函数)中特别有帮助。


  - 表中有大量的行(100万行有1万个独特值可以接收使用位图索引)


  - 表上有频繁复杂查询


  - 数据库环境为数据仓库(DSS系统)。由于位图索引的加锁形式,所以它不大适合联机事务处理(OLTP)环境。不能单独锁定位图的其中一个位置。


  位图被锁定的最小数量为1个位图段,它可以达到半个数据块的大小。改变一行的值将会导致整个位图段被锁,同时锁住了其他的行。


  这对于用户如果有大量的UPDATE,INSERT,DELETE语句及其不利。但对于数据是批量导入或更新则没有问题,如在一个数据仓库系统中。


  - 位图连接索引是9i引入的一个新方法,可以避免在运行时的连接操作,因为在索引创建时位图索引已经基于了连接。


  BJI是一个在空间上减少选择数据量的有效方法。这些数据导致的连接操作和限制都永久地存储在BJI中。连接条件是一个相对的内部连接,维度表的主键和事实表的外键。


  4)限制条件


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


  - 位图索引在Trusted Oracle中不支持


  - 不能被规则优化器(RBO)使用


  - 不能用于分区表的全局索引


  - 位图索引不支持build或rebuild的ONLINE选项,在10.2中,只有位图连接索引不支持,普通位图索引可以指定ONLINE选项。


  - 对于有直接装载的位图索引,不提供SORTED_INDEX标记


  - 位图索引不能用于完整性检查


  - 位图索引不能定义为UNIQUE


  - 9i之前,不能在索引组织表上创建位图索引,9i开始支持在索引组织表上创建位图索引:在IOT上创建位图索引要求有一个映射表。


  - 不能给域索引指定BITMAP


  5)相对B*tree索引的优势


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


  - 在大量复杂查询中节省响应时间


  - 对于常规的B*tree索引,有效地节省了空间使用


  a)在某一个字段上只有少量的独特值:


  如果在一个具有唯一性的字段上建立位图索引,那么它要求的空间大大超过B*tree索引。然而,对于每个值都重复了成百上千次,位图索引通常小于常规B*tree索引的25%。位图自身采用压缩格式存储。


  b)如果多个列被索引


  相对于多列(或连接)的B*tree索引,位图索引节约了相当可观的存储。在一个只有B*tree索引的数据库中,必须要预先评估在当个查询中可能访问到的列,然后在这些列上创建组合索引。


  这类索引不仅需要大量的空间,而且要求要有一定的顺序,如一个B*tree索引建立在(MARITAL_STATUS,REGION,GENDER)字段上,查询只访问REGION,GENDER时,索引是不起效果的。为了在数据库中充分地使用索引,必须在这些列上变换另一种排列顺序建立索引。举个简单例子,在一个较低的集的势的3个列中,那么可能就存在有6种位置关系不同的组合索引。需要在磁盘空间和性能之前权衡考虑创建何种位置顺序的索引。位图索引解决了这个进退两难问题。位图索引在查询执行过程中可以有效地组合,所以3个较小的单个字段的位图索引可以完成6种3个字段组合的B*tree索引的工作。


  - 非常高效的并行DML和装载


  位图索引在数据仓库应用中很有效率,但是不适合在OLTP应用系统中使用,因为有大量同时发生的INSERT,UPDATE,DELETE操作。索引直到每个DML操作完成之后才进行维护。例如,如果插入1000行数据,插入的行将放置在排序缓冲区中,然后更新批量更新所有的1000条索引条目。(这就是为什么SORT_AREA_SIZE需要设置为一个较优性能的值,用于位图索引的插入和更新)。所以,每个DML操作,位图段只更新一次,即使段中有多行变更时。


  - 行包含null值(见"位图索引和NULLs")


  6)使用小贴士


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


  - 在所有可能非空的字段上声明NOT NULL约束,可以减少存储需求,因为位图不会有NULL值。


  - 使用固定长度的数据格式可以减少存储需求。


  - 增大CREATE_BITMAP_AREA_SIZE初始化参数,可以加快查询处理


  该参数决定了分配给位图创建的内存大小,默认值为8MB。更大的值可以支持更大的连续位图,所以可以较快查询处理。


  - 增大BITMAP_MERGE_AREA_SIZE初始化参数可以加快索引的范围扫描。该参数决定了索引范围扫描时合并位图分配的内存大小。默认值为1MB。


  7)位图索引示例


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


  1个公司的客户数据


  CUSTOMER#   MARITAL_STATUS   REGION   GENDER  INCOME_LEVEL


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


  101        single           east     male    bracket_1


  102        married          central  female  bracket_4


  103        married          west     female  bracket_2


  104        divorced         west     male    bracket_4


  105        single           central  female  bracket_2


  106        married          central  female  bracket_3


  MARITAL_STATUS,REGION,GENDER,INCOME_LEVEL字段都是有较少的独特值(婚姻状况和地域只有三种值,性别只有2种值,收入级别只有4种值),较为适合在这些字段上创建位图索引。但在CUSTOMER#上不适合创建位图索引,因为该字段独特值较多。


  相反,在该字段上创建一个唯一的B*tree索引,将十分有效。


  本例中,REGION字段上的位图索引。


  由三个分开的位图组成,每个region一个。


  REGION='east'  REGION='central'  REGION='west'  ##       CUSTOMER#


  1              0                 0              <==       101


  0              1                 0              <==       102


  0              0                 1              <==       103


  0              0                 1              <==       104


  0              1                 0              <==       105


  0              1                 0              <==       106


  位图中的每个条目(或是说"bit")对应CUSTOMER表中的每一行。每个bit的值依赖于表中相应行的值。例如,REGION='east'的位图,它的第一个bit为1。这是因为CUSTOMER表的第一行,REGION='east'。REGION='east'的位图其他bit为0,是因为该表的其他行的REGION字段为其他值。


  一个分析员调查该公司客户的人口趋势,可能会问:"居住在中心区或西区的客户有多少是已婚的?",该问题就是下面这个查询SQL:


  SELECT COUNT(*) FROM CUSTOMER


  WHERE MARITAL_STATUS = 'married' AND REGION IN ('central','west');


  位图索引可以很高效地完成查询,因为只要计算位图中结果为1的数量,如图所示。最后要确认哪些客户符合要求,只要通过位图结果去访问表就可以了。


  status = 'married'     region = 'central'    region = 'west'


  0                          0                   0


  1                          1                   0


  1                          0                   1


  0                 AND(     0           OR      1       )


  0                          1                   0


  1                          1                   0


  0                           0              0


  1                           1              1    ==> 2nd row


  = 1                           1              1    ==> 3rd row


  0                 AND       1            = 0


  0                           1              0


  1                           1              1    ==> last row


  8)位图索引和NULLs


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


  位图索引包含的行有NULL值,和其他类型的索引完全不相同。对null值索引有利于一些类型的SQL语句,如查询包含了聚合函数COUNT。


  例1:


  -------


  SELECT COUNT(*) FROM EMP;


  任何一个位图索引都可以用于该查询,因为表中所有行都被索引,包括那些NULL数据。如果null值未编入索引,优化器只有当,某个字段上有NOT NULL约束时,使用这个字段的索引。


  例2:


  -------


  SELECT COUNT(*) FROM EMP WHERE COMM IS NULL;


  该查询可以通过在COMM上建立一个位图索引来优化。


  例3:


  -------


  SELECT COUNT(*) FROM CUSTOMER WHERE GENDER = 'M' AND STATE != 'CA';


  该查询可以通过GENDER = 'M'的位图减去STATE = 'CA'的位图来得到结果。如果STATE字段包含NULL值(也就是说,该字段上没有NOT NULL约束),那么STATE = 'NULL'的位图也必须从该结果中减去。


  9)表和视图


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


  通过TYPE='BITMAP'条件,可以在USER_INDEXES,ALL_INDEXES,DBA_INDEXES视图中查询到位图索引的信息。


  10)执行计划上的标签


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


  参看:


  Oracle8 Tuning Release 8.0


  Oracle8i Tuning Release 8.1.5


  Oracle9i Database Performance Tuning Guide and Reference Release 1 (9.0.1)


  Oracle9i Database Performance Tuning Guide and Reference Release 2 (9.2)


  Oracle Database Performance Tuning Guide and Reference 10gRelease 1 (10.1)


  Oracle Database Performance Tuning Guide and Reference 10gRelease 2 (10.2)


  Chapter Using EXPLAIN PLAN


  11)使用位图索引的HINT(7.3 - 8.0 - 8.1 - 9.0 - 9.2 - 10.1 - 10.2)


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


  INDEX


  INDEX_COMBINE


  12)初始化参数


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


  <Parameter:CREATE_BITMAP_AREA_SIZE>


  <Parameter:BITMAP_MERGE_AREA_SIZE>


  <Parameter:B_TREE_BITMAP_PLANS>


  <Parameter:V733_PLANS_ENABLED>


转载地址:http://edu.cnzz.cn/201007/649422ac.shtml

单细胞数据互转实战:从Scanpy的h5ad到Seurat对象的四种高效方法 本文针对单细胞数据分析中Scanpy的h5ad格式Seurat对象互转的常见难题,详细对比了SeuratDisk、anndataR、schard和sceasy四种高效转换方法。文章从实战出发,剖析了每种方法的原理、操作流程、优缺点及避坑指南,并提供了清晰的选型策略,帮助用户根据数据特点选择最佳方案,实现跨平台数据的无缝衔接。 阅读详情

相关推荐

77、Oracle触发器索引优化技术详解

本文详细介绍了Oracle触发器和索引优化技术,包括触发器的创建、修改、使用场景以及其在PHP应用中的集成;同时深入解析了B-tree索引、位图索引Oracle Text索引的使用方法和优化策略。通过实际案例分析,展示了如何在真实业务场景中提升数据库性能,并提供了索引创建监控的流程图及最佳实践建议。

ttt77的博客 111

oracle基础之分区表索引 2021-11-11

oracle基础之分区表索引: 1、全局索引:global 2、本地索引:local 二者的区别: 第一,本地是每个分区单独进行索引的管理,所以用分区的本地索引进行字段查询时速度更快,全局索引是在整个表格中创建一个索引对所有的数据进行统一管理的。也就是说本地索引的速度比全局索引快。 第二,本地索引是不能创建唯一类型的索引的。因为索引在一张表格里有唯一性,但各分区之间不知道各自的索引情况。 第三,全局索引不能创建位图类型的索引的,对全局也就是整张表来说,不管各分区字段的数据有多重复,放在整张表里来看,还是些

weixin_45388047的博客 583

合工大计算机学院操作系统 实验五-进程的创建

合工大计算机学院操作系统 实验五-进程的创建1. 实验目的和任务要求掌握创建子进程和加载执行新程序的方法,理解创建子进程和加载执行程序的不同。调试跟踪 fork 和 execve 系统调用函数的执行过程。

Oracle 之索引,妙不可言(四)——位图索引

Oracle 之索引——位图索引

分享学习路线、运维调优与故障等解决方案 2038

oracle bitmap btree 索引,oracle之bitmap索引

oracle常见的索引是BTree索引和Bitmap索引。BTree索引特点:默认索引适合大量增删改查不能用or操作符适合高基数的列(即唯一值多)创建sql:create index lie_idx1 on table(liename);Bitmap索引特点:做update代价非常高非常适合or操作符基数少的列(即重复值多)创建sql:create bitmap index lie_bit_idx...

weixin_32179097的博客 1501

关于 Oracle 分区索引的创建和维护

像分区表一样,索引也可以进行分区,包括 1、全局分区索引 是一个独立的分区。 2、本地分区索引 自动和分区表相关联。 适用范围: 通常来说,全局分区索引适用于 OLTP 在线交易系统;而局部分...

cuantangnie3915的博客 256

oracle 位图索引创建,Oracle关于位图索引创建应用(2)

sp; 1 1 ==> last row8)位图索引和NULLs---------------------位图索引包含的行有NULL值,和其他类型的索引完全不相同。对null值索引有利于一些类型的SQL语句,如查询包含了聚合函数COUNT。例1:-------SELECT COUNT(*) FROM EMP;任...

weixin_42513944的博客 454

oracle位图索引

oracle位图索引 以下内容主要都是关于oracle 10g位图索引,重点是存储,其它优缺点,查询机制等也略微介绍,概因为存储机制是根基。内容主要分四个部分:1)来源于http://blog.chinaunix.net/uid-20687159-id-1894992.html2)来源于http://blog.sina.com.cn/s/blo...

weixin_30650039的博客 228

ORALCE10G 位图索引探究

ORALCE10G 位图索引探究 1. 实验目的 研究对oracle数据库位图索引进行DML操作的探究,加深理解位图索引的...

小麦苗DBA宝典 379

Oracle中的B-树索引和位图索引

索引的作用: 如果一个堆组织表没有索引,数据库必须执行全表扫描(扫描HWM下所有的块)。索引只影响执行速度。如果表上存在过多的索引,由于数据库需要维护索引,将会降低DML性能。 何时使用索引: 1、要索引的列经常被查询,并只返回表中的行的总数的一小部分。 2、列或列集上存在引用完整性约束(强烈建议对该列或列集建立索引)。如果建立索引将可以避免更新父表主键、合并父表、从父表删除行时可能引

wl20050141的专栏 910

Oracle Concept》第三章 - 12

背景:按照《Oracle Concept》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。前言《Introduction to Oracle D...

bisal的专栏 1151

oracle教程:创建位图索引

1、位图索引适合创建在低基数列上,比方说男、女或者颜色、56个民族等等。只能精确查询=,不能做范围查询>,

学亮编程手记 1798

详解oracle bitmap位图索引

位图索引oracle中非常重要的一种索引形式。本文通过总结有关位图索引的资料,尝试回答如下几个问题: 1:什么是位图索引? 2:位图索引适合什么场景,不适合什么场景? 3:位图索引的性能如何? 什么是位图索引位图索引,顾名思义,“位”有关。大家都知道,计算机中的所有信息最终都是通过“位bit”来运算的, 二进制位运算在计算机中是非常高效的。每一个二进制位都可以取值0或者1

ezbit 2万+

ORACLE-位图索引

关于位图索引,搜索到一个很通俗的例子: 1、语法 create bitmap index index_name on 表名(字段); 2、举个例子你就能明白了: 如有表 test(id,name,address) 数据 (1,张三,大连) (2,李四,天津) (3,王五,北京) (4,赵六,大连) .... 类似这样的数据,如果查询的时候用到 【where address

FLEXES的ORACLE之路 966

Oracle SQL优化基础》之位图索引(BitMap index)

有不少做BI的后台同事问我,位图索引是啥?啥时候用? 此篇仅作为一个扫盲篇,有不对的地方欢迎大神指正。 首先我们要搞明白位图索引是什么,普通的B*树索引有什么区别呢? 顾名思义,首先他是个索引(废话!),其次是以位图的形式进行存储、计算的。 看个图,下面是我们常用的B*树索引结构(取自网络): 可以看得出,表中索引列的每行数据都会维护到索引树中(Null值除外) 再来看看我们的位图

doupeihua的专栏 5800

位图索引深度探讨

一.什么是位图索引我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的.而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个位图索引块可能指向的是几十甚至成百上千行数据的位置. 这种方式...

weixin_30745641的博客 269

Oracle创建索引bitmap,索引组织表上创建BITMAP索引(一)

Oracle的索引组织表也支持BITMAP索引类型,不过需要映射表的支持。如果没有创建映射表,直接建立BITMAP索引,则会报错:SQL> CREATE TABLE T_INDEX_ORG2 (ID NUMBER PRIMARY KEY,3 NAME VARCHAR2(30),4 TYPE VARCHAR2(30))5 ORGANIZATION INDEX;表已创建。SQL> ...

weixin_34544309的博客 827

Oracle中索引示例

--drop table customers; --建测试用表 CREATE TABLE customers ( customer_id INTEGER CONSTRAINT customers_pk PRIMARY KEY, first_name VARCHAR2(10) NOT NULL, last_name VARCHAR2(10) NOT NULL, dob DATE, phone VARCHAR2(12) ); drop table customers; --添加测试数据 I.

qq_41144042的博客 476
上一篇: Oracle中的位图索引是什么,怎么用的啊?
下一篇: 《Oracle SQL优化基础》之位图索引(BitMap index)
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值