oracle 索引
oracle 查询索引关联字段的方法
![oracle 查询索引关联字段的方法](https://img.taocdn.com/s3/m/5558520432687e21af45b307e87101f69e31fb0a.png)
oracle 查询索引关联字段的方法在Oracle数据库中,索引是用来加速查询操作的一种数据结构。
通过使用索引,可以快速定位到包含特定值的数据行,从而提高查询的执行效率。
当需要查询索引关联字段时,可以使用以下方法。
1. 使用EXPLAIN PLAN:使用EXPLAIN PLAN可以查看查询计划,包括使用的索引和执行顺序等信息。
通过查看查询计划,可以确定是否使用了索引以及使用的索引类型。
以下是使用EXPLAIN PLAN查询索引关联字段的示例:```sqlEXPLAIN PLAN FORSELECT *FROM table_nameWHERE indexed_column = 'some_value';SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);```在执行以上语句后,可以查看查询计划中的相关信息,例如是否使用了索引、使用的索引类型等。
2. 使用索引提示:索引提示是一种指导查询优化器使用特定索引的方法。
可以使用索引提示来强制查询优化器使用特定的索引。
以下是使用索引提示查询索引关联字段的示例:```sqlSELECT /*+ INDEX(table_name index_name) */ *FROM table_nameWHERE indexed_column = 'some_value';```在以上示例中,使用了索引提示将查询优化器强制指定使用特定的索引。
3. 使用索引相关的动态视图:Oracle数据库中提供了一系列动态视图,用于查询数据库的内部信息。
以下是使用索引相关的动态视图查询索引关联字段的示例:```sqlSELECT index_name, column_nameFROM all_ind_columnsWHERE table_name = 'table_name';```在以上示例中,使用了动态视图all_ind_columns来查询指定表的索引相关的字段信息。
Oracle索引(Index)介绍使用
![Oracle索引(Index)介绍使用](https://img.taocdn.com/s3/m/13e3e9593d1ec5da50e2524de518964bcf84d2a8.png)
Oracle索引(Index)介绍使⽤1.什么是引 索引是建⽴在表的⼀列或多个列上的辅助对象,⽬的是加快访问表中的数据;Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶⼦节点不同B*数索引;索引由根节点、分⽀节点和叶⼦节点组成,上级索引块包含下级索引块的索引数据,叶节点包含索引数据和确定⾏实际位置的rowid。
2.使⽤索引的⽬的 当查询返回的记录数排序表<40%⾮排序表 <7%且表的碎⽚较多(频繁增加、删除)时可以加快查询速度减少I/O操作消除磁盘排序3.索引的分类及结构 从物理上说,索引通常可以分为:分区和⾮分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。
其中,B树索引属于最常见的索引,由于我们的这篇⽂章主要就是对B树索引所做的探讨,因此下⾯只要说到索引,都是指B树索引。
B树索引是⼀个典型的树结构,其包含的组件主要是:1) 叶⼦节点(Leaf node):包含条⽬直接指向表⾥的数据⾏。
2) 分⽀节点(Branch node):包含的条⽬指向索引⾥其他的分⽀节点或者是叶⼦节点。
3) 根节点(Root node):⼀个B树索引只有⼀个根节点,它实际就是位于树的最顶端的分⽀节点。
可以⽤下图⼀来描述B树索引的结构。
其中,B表⽰分⽀节点,⽽L表⽰叶⼦节点。
对于分⽀节点块(包括根节点块)来说,其所包含的索引条⽬都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。
每个索引条⽬(也可以叫做每条记录)都具有两个字段。
第⼀个字段表⽰当前该分⽀节点块下⾯所链接的索引块中所包含的最⼩键值;第⼆个字段为四个字节,表⽰所链接的索引块的地址,该地址指向下⾯⼀个索引块。
在⼀个分⽀节点块中所能容纳的记录⾏数由数据块⼤⼩以及索引键值的长度决定。
⽐如从上图⼀可以看到,对于根节点块来说,包含三条记录,分别为(0 B1)、(500 B2)、(1000B3),它们指向三个分⽀节点块。
oracle数据库创建索引例子
![oracle数据库创建索引例子](https://img.taocdn.com/s3/m/641670d7112de2bd960590c69ec3d5bbfd0ada0f.png)
oracle数据库创建索引例子Oracle数据库创建索引例子在Oracle数据库中,创建索引是优化查询性能的重要手段之一。
下面列举了一些创建索引的例子,并进行详细的讲解。
创建简单索引的例子1.创建唯一索引–语法:CREATE UNIQUE INDEX index_name ON table_name(column_name);–示例:创建一个名为idx_unique_id的唯一索引,索引字段为id,索引表为employees。
CREATE UNIQUE INDEX idx_unique_id ON employees(id);–说明:唯一索引保证了索引字段的值是唯一的,用于字段中不能存在重复值的情况。
2.创建普通索引–语法:CREATE INDEX index_name ONtable_name(column_name);–示例:创建一个名为idx_lastname的普通索引,索引字段为last_name,索引表为employees。
CREATE INDEX idx_lastname ON employee s(last_name);–说明:普通索引可以加快查询速度,适用于频繁查询的字段。
创建复合索引的例子3.创建复合唯一索引–语法:CREATE UNIQUE INDEX index_name ON table_name(column1, column2);–示例:创建一个名为idx_unique_name_dept 的复合唯一索引,索引字段为name和dept_id,索引表为employees。
CREATE UNIQUE INDEX idx_unique_name_d ept ON employees(name, dept_id);–说明:复合唯一索引是基于多个字段的唯一索引,可以保证多个字段组合的值是唯一的。
4.创建复合普通索引–语法:CREATE INDEX index_name ON table_name(column1, column2);–示例:创建一个名为idx_firstname_lastname的复合普通索引,索引字段为first_name和last_name,索引表为employees。
oracle索引的结构
![oracle索引的结构](https://img.taocdn.com/s3/m/29e5f6c7cd22bcd126fff705cc17552707225e06.png)
oracle索引的结构Oracle索引的结构:了解索引对数据库性能的重要性引言:在数据库中,索引是一种数据结构,它可以加快数据的检索速度,提高数据库的性能。
Oracle作为一种关系型数据库管理系统,也使用索引来优化查询操作。
本文将详细介绍Oracle索引的结构以及其对数据库性能的影响。
一、什么是索引索引是一种数据结构,它类似于书籍的目录,可以帮助我们快速找到需要的数据。
在Oracle中,索引由一个或多个列组成,可以根据这些列的值快速定位到对应的行。
二、Oracle索引的结构1. B树索引B树索引是Oracle中最常见的索引类型。
它使用B树数据结构来组织索引数据,具有平衡性和高效性。
B树索引将索引数据存储在叶子节点中,并使用非叶子节点来加速查找过程。
B树索引适用于范围查询和精确查询。
2. B+树索引B+树索引是B树索引的一种变体,也是Oracle中常用的索引类型。
与B树索引不同,B+树索引将所有索引数据存储在叶子节点中,并使用非叶子节点来组织叶子节点之间的关系。
B+树索引适用于范围查询和排序操作。
3. 唯一索引唯一索引是一种特殊的索引类型,它要求索引列的值唯一,即不允许重复值。
唯一索引可以提高数据的完整性,并且可以通过快速查找来避免重复插入。
在Oracle中,唯一索引可以是B树索引或B+树索引。
4. 聚簇索引聚簇索引是一种特殊的索引类型,它将数据存储在物理上相邻的区域。
在Oracle中,表只能有一个聚簇索引,它可以加速范围查询和连接操作。
聚簇索引通常与主键约束一起使用。
三、索引对数据库性能的影响1. 提高查询速度索引可以加快查询操作的速度,尤其是在大型数据库中。
通过使用索引,数据库可以更快地定位到需要的数据,而不必扫描整个表。
2. 降低IO成本索引可以减少磁盘IO操作,提高数据库的IO性能。
当查询条件与索引列匹配时,数据库可以直接读取索引节点,而不必读取整个数据块。
3. 影响更新性能虽然索引可以提高查询性能,但对于更新操作,索引可能会带来额外的开销。
oracle主键索引和普通索引
![oracle主键索引和普通索引](https://img.taocdn.com/s3/m/94617e6f443610661ed9ad51f01dc281e53a56d5.png)
oracle主键索引和普通索引在关系型数据库中,索引是提高查询效率的重要手段之一。
在Oracle数据库中,主键索引和普通索引是常见的两种索引类型。
本文将介绍它们的定义、特点以及适用场景,以帮助读者理解和正确使用这两种索引。
一、主键索引主键索引是一种用于唯一标识表中记录的索引类型。
在创建表时,可以通过定义主键来自动创建主键索引。
主键索引中的键值必须是唯一的,并且不能为空值。
1. 定义主键索引在创建表时,可以通过在列定义后使用PRIMARY KEY关键字来定义主键。
例如,创建一个名为"customer"的表,并为"customer_id"列定义主键索引,可以使用以下语句:CREATE TABLE customer (customer_id NUMBER PRIMARY KEY,first_name VARCHAR2(50),last_name VARCHAR2(50));2. 特点与优势- 主键索引的键值唯一且不能为空值,确保了表中记录的完整性。
- 主键索引物理上以B树的形式存储,查询速度较快。
- 主键索引可以被外键引用,用于维护表与表之间的引用完整性。
- 主键索引可以用于加速表的连接操作,提升查询性能。
3. 适用场景主键索引适合用于标识唯一记录的列,例如身份证号、学号等。
在高并发的系统中,主键索引的使用可以避免数据冲突和错误插入。
二、普通索引普通索引(也称为辅助索引)是一种非唯一索引类型,可以用于提高查询效率。
与主键索引不同,普通索引的键值可以重复且可以为空值。
1. 定义普通索引在创建表时,可以通过使用CREATE INDEX语句来定义普通索引。
例如,为"product_name"列创建一个普通索引,可以使用以下语句:CREATE INDEX idx_product_name ON products(product_name);2. 特点与优势- 普通索引可以加速查询速度,减少数据扫描的次数。
Oracle数据库索引的优点与缺点的描述
![Oracle数据库索引的优点与缺点的描述](https://img.taocdn.com/s3/m/2435a009763231126edb11f9.png)
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
增加索引,并不能明显加快检索速度。第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。
这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在Oracle数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:在经常需要搜索的列上,可以加快搜索的速度;
数据库的索引分为:聚集索引,非聚集索引,唯一索引。
优点:方便了查询,在数据量大时排序更易查询
缺点:查询时需要进行重新排序,减少了效率。物理索引缺点 建立索引效率低,只能建一个
ቤተ መጻሕፍቲ ባይዱ
更有说服力的
为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。
oracle索引,索引的建立、修改、删除
![oracle索引,索引的建立、修改、删除](https://img.taocdn.com/s3/m/e084419985868762caaedd3383c4bb4cf6ecb75e.png)
oracle索引,索引的建⽴、修改、删除索引,索引的建⽴、修改、删除2007-10-05 13:29 来源: 作者:⽹友评论 0 条浏览次数 2986索引索引是关系数据库中⽤于存放每⼀条记录的⼀种对象,主要⽬的是加快数据的读取速度和完整性检查。
建⽴索引是⼀项技术性要求⾼的⼯作。
⼀般在数据库设计阶段的与数据库结构⼀道考虑。
应⽤系统的性能直接与索引的合理直接有关。
下⾯给出建⽴索引的⽅法和要点。
§3.5.1 建⽴索引1. CREATE INDEX命令语法:CREATE INDEXCREATE [unique] INDEX [user.]indexON [user.]table (column [ASC | DESC] [,column[ASC | DESC] ] ... )[CLUSTER [scheam.]cluster][INITRANS n][MAXTRANS n][PCTFREE n][STORAGE storage][TABLESPACE tablespace][NO SORT]Advanced其中:schema ORACLE模式,缺省即为当前帐户index 索引名table 创建索引的基表名column 基表中的列名,⼀个索引最多有16列,long列、long raw列不能建索引列DESC、ASC 缺省为ASC即升序排序CLUSTER 指定⼀个聚簇(Hash cluster不能建索引)INITRANS、MAXTRANS 指定初始和最⼤事务⼊⼝数Tablespace 表空间名STORAGE 存储参数,同create table 中的storage.PCTFREE 索引数据块空闲空间的百分⽐(不能指定pctused)NOSORT 不(能)排序(存储时就已按升序,所以指出不再排序)2.建⽴索引的⽬的:建⽴索引的⽬的是:l 提⾼对表的查询速度;l 对表有关列的取值进⾏检查。
但是,对表进⾏insert,update,delete处理时,由于要表的存放位置记录到索引项中⽽会降低⼀些速度。
oracle 查询索引语句
![oracle 查询索引语句](https://img.taocdn.com/s3/m/06eacb0d42323968011ca300a6c30c225901f009.png)
oracle 查询索引语句一、查询索引定义1. 查询Oracle数据库中所有的索引```SELECT index_name, table_name FROM all_indexes;```2. 查询指定表中的所有索引```SELECT index_name FROM all_indexes WHERE table_name = '表名';```3. 查询指定索引的定义```SELECT index_name, table_name, column_name FROM all_ind_columns WHERE index_name = '索引名';```4. 查询索引的类型```SELECT index_name, table_name, index_type FROM all_indexes;```5. 查询索引的存储方式```SELECT index_name, table_name, index_type, index_subpartition_name, index_partition_name FROM all_indexes;```二、查询索引状态与统计信息1. 查询索引的状态(有效/无效)```SELECT index_name, status FROM all_indexes;```2. 查询索引的使用情况(最后一次访问时间、读取次数等)```SELECT index_name, last_analyzed, num_rows, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes;```3. 查询索引的大小```SELECT index_name, table_name, index_type, ROUND(bytes/1024/1024, 2) AS size_mb FROM dba_segments WHERE segment_type = 'INDEX';```4. 查询索引的碎片化情况```SELECT index_name, table_name, index_type, blevel, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes; ```5. 查询索引的使用情况(是否被频繁访问)```SELECT index_name, table_name, user_reads, user_updates FROM all_indexes;```三、查询索引的相关约束1. 查询索引所属的表的主键约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'UNIQUE';```2. 查询索引所属的表的外键约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```3. 查询索引所属的表的唯一约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```4. 查询索引所属的表的检查约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```5. 查询索引所属的表的默认值约束```SELECT index_name, table_name FROM all_indexes WHERE index_type = 'NORMAL' AND uniqueness = 'NONUNIQUE';```四、查询索引的相关操作1. 查询索引的创建语句```SELECT dbms_metadata.get_ddl('INDEX', '索引名') FROM dual; ```2. 查询索引的重建语句```SELECT 'ALTER INDEX ' || index_name || ' REBUILD;' FROM all_indexes;```3. 查询索引的重命名语句```SELECT 'ALTER INDEX ' || index_name || ' RENAME TO 新索引名;' FROM all_indexes;```4. 查询索引的删除语句```SELECT 'DROP INDEX ' || index_name || ';' FROM all_indexes;```5. 查询索引的禁用语句```SELECT 'ALTER INDEX ' || index_name || ' UNUSABLE;' FROM all_indexes;```五、查询索引的相关性能优化1. 查询索引是否需要重新构建```SELECT index_name, table_name, last_analyzed FROM all_indexes WHERE last_analyzed < SYSDATE - 30;```2. 查询未使用的索引```SELECT index_name, table_name FROM all_indexes WHERE status = 'VALID' AND (user_reads = 0 OR user_updates = 0); ```3. 查询索引碎片化严重的情况```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor FROM all_indexes WHERE blevel > 3;```4. 查询索引的大小是否过大```SELECT index_name, table_name, index_type, ROUND(bytes/1024/1024, 2) AS size_mb FROM dba_segments WHERE segment_type = 'INDEX' AND bytes/1024/1024 > 100;```5. 查询索引的选择性是否低```SELECT index_name, table_name, distinct_keys, num_rows, (distinct_keys/num_rows) AS selectivity FROM all_indexes WHERE selectivity < 0.1;```六、查询索引的相关性能统计1. 查询索引的读取次数与更新次数```SELECT index_name, table_name, user_reads, user_updates FROM all_indexes;```2. 查询索引的平均访问时间```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor, num_rows, (leaf_blocks/clustering_factor) AS avg_access_time FROM all_indexes;```3. 查询索引的存储效率```SELECT index_name, table_name, blevel, leaf_blocks,distinct_keys, clustering_factor, (leaf_blocks/clustering_factor) AS storage_efficiency FROM all_indexes;```4. 查询索引的选择性```SELECT index_name, table_name, distinct_keys, num_rows, (distinct_keys/num_rows) AS selectivity FROM all_indexes;```5. 查询索引的碎片率```SELECT index_name, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor, (leaf_blocks/clustering_factor) AS fragmentation FROM all_indexes;```以上是关于Oracle查询索引的一些常用语句,通过这些语句可以方便地查询索引的定义、状态、统计信息以及进行相关操作和性能优化。
oracle索引原理详解
![oracle索引原理详解](https://img.taocdn.com/s3/m/3e2fa031a517866fb84ae45c3b3567ec102ddc16.png)
oracle索引原理详解Oracle数据库中的索引是用于提高数据检索速度的重要工具。
了解Oracle索引的原理对于数据库管理员和开发人员来说是非常重要的。
一、索引的基本概念索引是Oracle数据库中的一个对象,它可以帮助数据库系统更快地检索数据。
索引类似于书籍的目录,可以快速定位到所需的数据。
二、索引的分类1. B-Tree索引:这是Oracle中最常用的索引类型,基于平衡多路搜索树(B-Tree)实现。
B-Tree索引适用于大多数数据类型,包括字符、数字和日期等。
2. Bitmap索引:位图索引主要用于处理包含大量重复值的列。
通过位图索引,可以更高效地处理这些列的查询。
3. 函数基索引:函数基索引允许在列上应用函数,然后对该结果进行索引。
这可以用于优化包含函数操作的查询。
4. 反转键索引:反转键索引是一种特殊类型的B-Tree索引,用于优化插入操作。
通过反转键顺序,可以更高效地处理插入操作。
三、索引的创建和维护1. 创建索引:创建索引的基本语法是“CREATE INDEX index_name ON table_name (column_name)”。
其中,index_name是索引的名称,table_name是要创建索引的表名,column_name是要索引的列名。
2. 维护索引:定期维护索引可以确保其性能和可靠性。
常用的维护操作包括重建索引(REBUILD INDEX)和重新组织索引(ORGANIZE INDEX)。
四、索引的优点和缺点1. 优点:使用索引可以显著提高数据检索速度,减少查询时间。
此外,索引还可以用于优化复杂查询的性能。
2. 缺点:虽然索引可以提高性能,但它们也会占用额外的磁盘空间。
此外,当表中的数据发生变化时,索引也需要更新,这可能会影响写操作的性能。
五、最佳实践1. 在经常用于搜索和排序的列上创建索引。
2. 根据查询模式和数据分布选择合适的索引类型。
3. 定期分析和维护索引,确保其性能和可靠性。
Oracle索引详解
![Oracle索引详解](https://img.taocdn.com/s3/m/68ae26f40875f46527d3240c844769eae009a305.png)
一.索引介绍1.1 索引的创建语法:CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>ON <schema>.<table_name>(<column_name> | <expression> ASC | DESC,<column_name> | <expression> ASC | DESC,...)TABLESPACE <tablespace_name>STORAGE <storage_settings>LOGGING | NOLOGGINGCOMPUTE STATISTICSNOCOMPRESS | COMPRESS<nn>NOSORT | REVERSEPARTITION | GLOBAL PARTITION<partition_setting>相关说明1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression 时即“基于函数的索引”3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)4)STORAGE:可进一步设置表空间的存储参数5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)6)COMPUTE STATISTICS:创建新索引时收集统计信息7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区1.2 索引特点:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
oracle索引介绍(图文详解)
![oracle索引介绍(图文详解)](https://img.taocdn.com/s3/m/a0d31ad72dc58bd63186bceb19e8b8f67c1cef9d.png)
oracle索引介绍(图⽂详解)对于数据库来说,索引是⼀个必选项,但对于现在的各种⼤型数据库来说,索引可以⼤⼤提⾼数据库的性能,以⾄于它变成了数据库不可缺少的⼀部分。
索引分类:逻辑分类single column or concatenated 对⼀列或多列建所引unique or nonunique 唯⼀的和⾮唯⼀的所引,也就是对某⼀列或⼏列的键值(key)是否是唯⼀的。
Function-based 基于某些函数索引,当执⾏某些函数时需要对其进⾏计算,可以将某些函数的计算结果事先保存并加以索引,提⾼效率。
Doman 索引数据库以外的数据,使⽤相对较少物理分类B-Tree :normal or reverse key B-Tree索引也是我们传统上常见所理解的索引,它⼜可以分为正常所引和倒序索引。
Bitmap :位图所引,后⾯会细讲B-Tree 索引 B-Tree index 也是我们传统上常见所理解的索引。
B-tree (balance tree)即平衡树,左右两个分⽀相对平衡。
B-Tree indexRoot为根节点,branch 为分⽀节点,leaf 到最下⾯⼀层称为叶⼦节点。
每个节点表⽰⼀层,当查找某⼀数据时先读根节点,再读⽀节点,最后找到叶⼦节点。
叶⼦节点会存放index entry (索引⼊⼝),每个索引⼊⼝对应⼀条记录。
Index entry 的组成部分:Indexentry entry header 存放⼀些控制信息。
Key column length 某⼀key的长度Key column value 某⼀个key 的值ROWID 指针,具体指向于某⼀个数据创建索引:复制代码代码如下:⽤户登录:SQL> conn as1/as1Connected.创建表:SQL> create table dex (id int,sex char(1),name char(10));Table created.向表中插⼊1000条数据SQL> beginfor i in 1..1000loopinsert into dex values(i,'M','chongshi');end loop;commit;end;/PL/SQL procedure successfully completed.查看表记录SQL> select * from dex;ID SE NAME---------- -- --------------------... . .....M chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshiM chongshirows selected.创建索引:SQL> create index dex_idx1 on dex(id);Index created.注:对表的第⼀列(id)创建索引。
oracle的索引类型
![oracle的索引类型](https://img.taocdn.com/s3/m/fb23cf4a03768e9951e79b89680203d8ce2f6a36.png)
oracle的索引类型
Oracle数据库中常见的索引类型包括:1. B树索引(B-tree Index):是Oracle 默认的索引类型,适用于等值查找和范围查找。
2. 唯一索引(Unique Index):确保索引列的值在表中是唯一的。
3. 聚集索引(Cluster Index):按照表的物理存储顺序进行索引,适用于频繁进行范围查找的列。
4. 位图索引(Bitmap Index):将索引列的不同值分组为位图,并对每个位图使用压缩算法,适用于低基数列(取值范围较小)。
5. 函数索引(Function-Based Index):基于表达式或函数的结果构建的索引,适用于计算、转换或覆盖列的查询。
6. 虚拟列索引(Virtual Column Index):基于虚拟列(由表达式计算而来)构建的索引。
7. 全文索引(Full-Text Index):适用于对文本数据进行全文搜索的场景。
8. 空间索引(Spatial Index):适用于对地理位置和空间数据进行查询和分析。
9. 哈希索引(Hash Index):根据哈希函数计算的值来构建索引,适用于等值查询的索引。
10. 反向索引(Reverse Key Index):逆序存储索引键的位模式,适合于高度并发且插入操作有序的情况。
需要根据具体业务和查询需求选择合适的索引类型,以提高查询性能。
Oracle中本地索引和全局索引
![Oracle中本地索引和全局索引](https://img.taocdn.com/s3/m/574654130640be1e650e52ea551810a6f524c809.png)
Oracle中本地索引和全局索引Oracle中的本地索引和全局索引在测试MPP和Click House的性能问题时候,发现业务上MPP查询速度有很⼤差别,后⾯发现是建⽴了本地索引来加速,对于现场场景,基本按⽇分区,其中如果不建⽴索引,10E量级数据和建⽴索引的差别将达到数⼗倍差别MPP的本地索引和Oracle中的索引概念差不多,但是没有全局索引(华为MPP没有,应该有性能⽅向考虑)分区索引分为本地(local index)索引和全局索引(global index)。
其中本地索引⼜可以分为有前缀(prefix)的索引和⽆前缀(nonprefix)的索引。
⽽全局索引⽬前只⽀持有前缀的索引。
B树索引和位图索引都可以分区,但是HASH索引不可以被分区。
位图索引必须是本地索引。
下⾯就介绍本地索引以及全局索引各⾃的特点来说明区别;本地索引特点1. 本地索引⼀定是分区索引,分区键等同于表的分区键,分区数等同于表的分区说,⼀句话,本地索引的分区机制和表的分区机制⼀样。
2. 如果本地索引的索引列以分区键开头,则称为前缀局部索引。
3. 如果本地索引的列不是以分区键开头,或者不包含分区键列,则称为⾮前缀索引。
4. 前缀和⾮前缀索引都可以⽀持索引分区消除,前提是查询的条件中包含索引分区键。
5. 本地索引只⽀持分区内的唯⼀性,⽆法⽀持表上的唯⼀性,因此如果要⽤本地索引去给表做唯⼀性约束,则约束中必须要包括分区键列。
6. 本地分区索引是对单个分区的,每个分区索引只指向⼀个表分区,全局索引则不然,⼀个分区索引能指向n个表分区,同时,⼀个表分区,也可能指向n个索引分区,对分区表中的某个分区做truncate或者move,shrink等,可能会影响到n个全局索引分区,正因为这点,本地分区索引具有更⾼的可⽤性。
7. 位图索引只能为本地分区索引。
8. 本地索引多应⽤于数据仓库环境中。
本地索引:创建了⼀个分区表后,如果需要在表上⾯创建索引,并且索引的分区机制和表的分区机制⼀样,那么这样的索引就叫做本地分区索引。
Oracle 全文索引(Oracle Text )
![Oracle 全文索引(Oracle Text )](https://img.taocdn.com/s3/m/fd0a90a7d1f34693daef3ef4.png)
Create index ftidx_n_ban_banlettpiny on n_ban(banlettpiny) indextype is ctxsys.ctxcat
parameters ('lexer cn_lexer index set n_ban_iset') tablespace TBS_INDEX_NAME;
Begin
ctx_ddl.create_index_set('n_ban_iset');
ctx_ddl.add_index('n_ban_iset','recdate');--备案日期加入到索引集,便于排序时使用
End;
--建立索引: n_ban的banlettpiny
-- drop index ftidx_n_ban_banlettpiny force;
--start D:/oracle/product/11.2.0/dbhome_2/ctx/admin/defaults/drdefus.sql
--start D:/oracle/product/11.2.0/dbhome_2/ctx/admin/defaults/drdeffrc.sql
--2、sys 登录赋权
Grant resource, connect, ctxapp to gsywjz;
Grant execute on ctxsys.ctx_cls to gsywjz;
Grant execute on ctxsys.ctx_ddl to gsywjz;
Grant execute on ctxsys.ctx_doc to gsywjz;
ctx_ddl.add_index('n_base_iset','apprauth');
oracle索引及使用原则
![oracle索引及使用原则](https://img.taocdn.com/s3/m/c1d8c13be3bd960590c69ec3d5bbfd0a7956d51a.png)
oracle索引及使用原则一、索引类型B-tree indexes 平衡二叉树,缺省的索引类型B-tree cluster indexes cluster的索引类型Hash cluster indexes cluster的hash索引类型Global and local indexes 与patitioned table相关的索引Reverse key indexes Oracle Real Application Cluster使用Bitmap indexes 位图索引,索相列的值属于一个很小的范围Function-based indexes 基于函数的索引Domain indexes二、使用索引的原则尽量在插入数据完成后建立索引,因为索引将导致插入数据变慢,特别是唯一索引在正确的表和列上建索引优化索引列顺序提高性能限制每个表的索引个数删除不需要的索引指定索引的block设置估计索引的大小设置存储参数指定索引使用的表空间建索引时使用并行使用nologing建立索引二,各种索引使用场合及建议(1)B*Tree索引。
常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。
Create index indexname on tablename(columnname[columnname...])(2)反向索引。
B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。
Create index indexname on tablename(columnname[columnname...]) reverse(3)降序索引。
B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。
Create index indexname on tablename(columnname DESC[columnname...])(4)位图索引。
oracle索引创建及使用
![oracle索引创建及使用](https://img.taocdn.com/s3/m/579fdc9032d4b14e852458fb770bf78a65293a08.png)
oracle索引创建及使用摘要:1.Oracle 索引的定义与作用2.Oracle 索引的类型3.Oracle 索引的创建方法4.Oracle 索引的使用方法5.Oracle 索引的维护与优化正文:【Oracle 索引的定义与作用】Oracle 索引是Oracle 数据库中一种重要的对象,它可以提高查询数据的速度,有效地减少查询时间。
索引的作用类似于书籍的目录,可以让我们快速定位到需要的信息。
在数据库中,索引可以让数据库系统快速找到所需的数据,从而提高查询效率。
【Oracle 索引的类型】Oracle 索引分为以下几种类型:1.B-Tree 索引:B-Tree 索引是最常用的索引类型,适用于大多数场景。
它将数据分布在多个节点上,通过平衡树的结构来提高查询效率。
2.Bitmap 索引:Bitmap 索引适用于数据量较小且列值分布较为集中的场景。
它将每个列的值用二进制位表示,从而减少存储空间和提高查询速度。
3.Function-Based 索引:基于函数的索引,可以通过对函数结果进行索引来提高查询效率。
适用于对复杂计算结果的查询加速。
4.Global Temporary Index:全局临时索引,适用于需要在多个表空间之间进行查询的场景。
5.Partition Index:分区索引,适用于将大表按照一定规则划分为多个分区的场景,可以提高查询效率。
【Oracle 索引的创建方法】创建Oracle 索引可以使用CREATE INDEX 语句,基本语法如下:```CREATE INDEX index_nameON table_name (column_name)INDEX_TYPE index_type(column_name, column_name,...)EXTENTS (number_of_extents)LOGGING logging_optionOLOGGING nologging_optionSTORAGE (storage_option);```其中,index_name 为索引名称,table_name 为表名,column_name 为需要创建索引的列名,index_type 为索引类型,number_of_extents 为索引分区数量,logging_option 和nologging_option 分别为是否启用日志记录和是否禁用日志记录,storage_option 为存储选项。
oracle索引类型和索引方法
![oracle索引类型和索引方法](https://img.taocdn.com/s3/m/82b95452cd7931b765ce0508763231126fdb7752.png)
文章标题:深度解析Oracle索引类型和索引方法在数据库管理系统中,索引是一种用于加速查询的数据结构。
在Oracle数据库中,索引类型和索引方法有很多种,它们各自有着特定的适用场景和优缺点。
在本文中,我们将深度探讨Oracle索引类型和索引方法的分类、特点和应用,帮助读者更全面、深入地理解这一重要的数据库概念。
一、索引类型的概念和分类1. 什么是索引?在数据库中,索引是一种特殊的数据结构,用于加快对表中数据的访问速度。
通过索引,数据库可以快速定位到待查询数据的位置,避免了全表扫描,提高了查询效率。
2. 索引类型的分类在Oracle数据库中,索引主要分为B树索引、位图索引、哈希索引和函数索引等几种类型。
每种类型的索引都有着自己的特点和适用场景,需要根据实际业务情况来选择合适的索引类型。
二、B树索引1. B树索引的特点B树索引是最常见和最常用的索引类型,它适用于等值查询和范围查询。
B树索引采用多路平衡查找树的结构,能够快速定位到目标数据的位置。
2. B树索引的应用场景在需要频繁进行等值查询和范围查询的列上,建立B树索引可以有效提高查询效率,减少IO开销。
三、位图索引1. 位图索引的特点位图索引适用于具有较低基数(数据重复度高)的列,它通过位图来表示数据的位置,适用于大量等值查询的场景。
2. 位图索引的应用场景在需要频繁进行大量等值查询的列上,建立位图索引可以显著减少IO开销,提高查询效率。
四、哈希索引1. 哈希索引的特点哈希索引将索引列的值通过哈希算法映射成哈希值,适用于等值查询的场景。
哈希索引查询速度非常快,但不适用于范围查询。
2. 哈希索引的应用场景在需要频繁进行等值查询的列上,建立哈希索引可以提高查询速度,适用于OLTP系统中对主键的查询。
五、函数索引1. 函数索引的特点函数索引是通过对索引列应用函数来建立索引,适用于对列进行函数操作后进行查询的场景。
2. 函数索引的应用场景在对列进行函数操作后进行频繁查询的场景中,建立函数索引可以提高查询效率和灵活性。
oracle 索引类型大全
![oracle 索引类型大全](https://img.taocdn.com/s3/m/d4d6ee1ba76e58fafab00336.png)
行
值 1 2 3 4 5 6 7 8 9 10
Male 1 0 0 0 0 0 0 0 1 1
Female 0 1 1 1 0 0 1 1 0 0
Null 0 0 0 0 1 1 0 0 0 0
如果搜索where gender=’Male’,要统计性别是”Male”的列行数的话,Oracle很快就能从位图中找到共3行即第1,9,10行是符合条件的;如果要搜索where gender=’Male’ or gender=’Female’的列的行数的话,也很容易从位图中找到共8行即1,2,3,4,7,8,9,10行是符合条件的。如果要搜索表的值的话,那么Oracle会用内部的转换函数将位图中的相关信息转换成rowid来访问数据块。
2 union all select 'number',dump(reverse(2),16) from dual
3 union all select 'number',dump(reverse(3),16) from dual;
'NUMBE DUMP(REVERSE(1),1
------ -----------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=400)
1 0 INDEX (RANGE SCAN) OF 'IND_DESC' (NON-UNIQUE) (Cost=2 Card=100 Bytes=400)
我们看到排序过程消失了,这是因为创建降序索引时Oracle已经把数据都按降序排好了。
提交完成。
SQL> select /*+ RULE*/* FROM test.testindex where upper(a)='A';
oracle索引的几种类型
![oracle索引的几种类型](https://img.taocdn.com/s3/m/80d164bbd0f34693daef5ef7ba0d4a7302766c00.png)
oracle索引的⼏种类型
1. b-tree索引
Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。
CREATE
INDEX语句时,默认就是在创建b-tree索引。
没有特别规定可⽤于任何情况。
2. 位图索引(bitmap index)
位图索引特定于该列只有⼏个枚举值的情况,⽐如性别字段,标⽰字段⽐如只有0和1的情况。
3. 基于函数的索引
⽐如经常对某个字段做查询的时候是带函数操作的,那么此时建⼀个函数索引就有价值了。
4. 分区索引和全局索引
这2个是⽤于分区表的时候。
前者是分区内索引,后者是全表索引
5. 反向索引(REVERSE)
这个索引不常见,但是特定情况特别有效,⽐如⼀个varchar(5)位字段(员⼯编号)含值
(10001,10002,10033,10005,10016..)
这种情况默认索引分布过于密集,不能利⽤好服务器的并⾏
但是反向之后10001,20001,33001,50001,61001就有了⼀个很好的分布,能⾼效的利⽤好并⾏运算。
6.HASH索引
HASH索引可能是访问数据库中数据的最快⽅法,但它也有⾃⾝的缺点。
集群键上不同值的数⽬必须在创建HASH集群之前就要知道。
需要在创建HASH集群的时候指定这个值。
使⽤HASH索引必须要使⽤HASH集群。
oracle 索引的添加规则
![oracle 索引的添加规则](https://img.taocdn.com/s3/m/fb14232afe00bed5b9f3f90f76c66137ee064fae.png)
oracle 索引的添加规则Oracle 索引是数据库中一种重要的数据结构,它能够使查询操作的速度得到显著的提升。
一个好的索引可以提高 SQL 查询的效率,加快数据库查询速度,但不当使用也会影响数据库性能。
以下是在 Oracle 数据库中添加索引的步骤:第一步:确定需要的列确定需要加索引的列,在查询中用到的列是需要加索引的。
在可以增加索引的列,首先应该考虑唯一值的列是否适合加索引。
第二步:创建索引在确定需要加索引的列以后,我们就需要创建索引。
常用的有 B 树索引和位图索引,其中 B 树索引就是在非数字列上建立排序树,使检索更快,位图索引则应用与高基数(distinct value)的列,如性别或邮政编码等。
创建索引语法如下:create index 索引名 on 表名(列名);第三步:判断索引的类型Oracle 中的索引类型非常多,如 B 树索引、位图索引、函数索引、簇索引等等。
在具体选择索引类型时,需要根据具体的场景进行选择。
比如说 B 树索引适用于经常用到相等比较而不是范围比较; 位图索引适用于取值范围比较小的情况下,索引复杂度低,查询效率很高。
第四步:考虑索引的创建时间对于查询次数较少的表,其创建时间基本上不会影响表的性能。
但是对于查询次数较多的表,建立索引的时间就会影响表的性能,因为在建立索引的过程中会锁定表,这个时间段里面所有涉及到此表的查询都会受到影响。
第五步:考虑索引的数量虽然索引可以加快查询效率,但是在建立索引的时候,需要考虑索引数量的大小。
如果索引数量过多,会导致插入、删除、更新表时,重建索引太慢,甚至无法索引,无意间会导致表的性能变慢。
所以需要对索引数量进行合理控制。
总之,在 Oracle 数据库中添加索引是一项非常重要的工作,如果合理使用索引可以让查询效率得到提升,加快数据库查询速度。
但是需要注意的是,在添加索引时不要过度,要考虑好各个因素,才能使索引发挥最优性能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle Index 各类索引介绍及创建方法[转]概述索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用。
在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等。
Oracle提供了大量索引选项。
知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。
一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。
而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。
这篇文章就将简单的讨论每个索引选项。
主要有以下内容:[1] 基本的索引概念查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。
访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
[2] 组合索引当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。
在Oracle9i 引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。
比如:表emp 有一个组合索引键,该索引包含了empno、ename和deptno。
在Oracle9i之前除非在where 之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。
特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引![3] ORACLE ROWID通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。
ROWID其实就是直接指向单独行的线路图。
如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。
[4] 限制索引限制索引是一些没有经验的开发人员经常犯的错误之一。
在SQL中有很多陷阱会使一些索引无法使用。
下面讨论一些常见的问题:4.1 使用不等于操作符(<>、!=)下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。
select cust_Id,cust_namefrom customerswhere cust_rating <> 'aa';把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。
select cust_Id,cust_namefrom customerswhere cust_rating < 'aa' or cust_rating > 'aa';特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
4.2 使用IS NULL 或IS NOT NULL使用IS NULL 或IS NOT NULL同样会限制索引的使用。
因为NULL值并没有被定义。
在SQL语句中使用NULL会有很多的麻烦。
因此建议开发人员在建表时,把需要索引的列设成NOT NULL。
如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在详细讨论)。
4.3 使用函数如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
下面的查询不会使用索引(只要它不是基于函数的索引)select empno,ename,deptnofrom empwhere trunc(hiredate)='01-MAY-81';把上面的语句改成下面的语句,这样就可以通过索引进行查找。
select empno,ename,deptnofrom empwhere hiredate<(to_date('01-MAY-81')+0.9999);4.4 比较不匹配的数据类型比较不匹配的数据类型也是比较难于发现的性能问题之一。
注意下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。
下面的语句将执行全表扫描。
select bank_name,address,city,state,zipfrom bankswhere account_number = 990354;Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:select bank_name,address,city,state,zipfrom bankswhere account_number ='990354';特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次“全表扫描”。
[5] 选择性使用USER_INDEXES视图,该视图中显示了一个distinct_keys列。
比较一下唯一键的数量和表中的行数,就可以判断索引的选择性。
选择性越高,索引返回的数据就越少。
[6] 群集因子(Clustering Factor)Clustering Factor位于USER_INDEXES视图中。
该列反映了数据相对于已索引的列是否显得有序。
如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目,表中的数据就越有序。
如果它的值接近于表中的行数,则表中的数据就不是很有序。
[7] 二元高度(Binary height)索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。
在对一个索引进行分析后,可以通过查询DBA_INDEXES的B-level列查看它的二元高度。
二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。
索引上如果有大量被删除的行,它的二元高度也会增加。
更新索引列也类似于删除操作,因为它增加了已删除键的数目。
重建索引可能会降低二元高度。
[8] 快速全局扫描在Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。
这个选项允许Oracle 执行一个全局索引扫描操作。
快速全局扫描读取B-树索引上所有树叶块。
初始化文件中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。
[9] 跳跃式扫描从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。
索引跳跃式扫描比全索引扫描要快的多。
下面的程序清单显示出性能的差别:create index skip1 on emp5(job,empno);index created.select count(*)from emp5where empno=7900;Elapsed:00:00:03.13Execution Plan0SELECT STATEMENT Optimizer=CHOOSE(Cost=4 Card=1 Bytes=5)10SORT(AGGREGATE)21INDEX(FAST FULL SCAN) OF 'SKIP1'(NON-UNIQUE)Statistics6826 consistent gets6819 physical readsselect /*+ index(emp5 skip1)*/ count(*)from emp5where empno=7900;Elapsed:00:00:00.56Execution Plan0SELECT STATEMENT Optimizer=CHOOSE(Cost=6 Card=1 Bytes=5)10SORT(AGGREGATE)21INDEX(SKIP SCAN) OF 'SKIP1'(NON-UNIQUE)Statistics21 consistent gets17 physical reads[10] 索引的类型B-树索引位图索引HASH索引索引编排表反转键索引基于函数的索引分区索引本地和全局索引简要解释:b*tree index:几乎所有的关系型数据库中都有b*tree类型索引,也是被最多使用的。
其树结构与二叉树比较类似,根据rid快速定位所访问的行。
反向索引:反转了b*tree索引码中的字节,是索引条目分配更均匀,多用于并行服务器环境下,用于减少索引叶的竞争。
降序索引:8i中新出现的索引类型,针对逆向排序的查询。
位图索引:使用位图来管理与数据行的对应关系,多用于OLAP系统。
函数索引:这种索引中保存了数据列基于function返回的值,在select * from table where function(column)=value这种类型的语句中起作用。
B*Tree索引B*Tree索引是最常见的索引结构,默认建立的索引就是这种类型的索引。
B*Tree索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。
当取出的行数占总行数比例较小时B-Tree索引比全表检索提供了更有效的方法。
但当检查的范围超过表的10%时就不能提高取回数据的性能。
B-Tree索引是基于二叉树的,由分支块(branch block)和叶块(leaf block)组成。
在树结构中,位于最底层底块被称为叶块,包含每个被索引列的值和行所对应的rowid。
在叶节点的上面是分支块,用来导航结构,包含了索引列(关键字)范围和另一索引块的地址。
假设我们要找索引中值为80的行,从索引树的最上层入口开始,定位到大于等于50,然后往左找,找到第2个分支块,定位为75-100,最后再定位到叶块上,找到80所对应的rowid,然后根据rowid去读取数据块获取数据。
如果查询条件是范围选择的,比如where column >20 and column <80,那么会先定位到第一个包含20的叶块,然后横向查找其他的叶块,直到找到包含80的块为止,不用每次都从入口进去再重新定位。
反向索引反向索引是B*Tree索引的一个分支,它的设计是为了运用在某些特定的环境下的。
Oracle推出它的主要目的就是为了降低在并行服务器(Oracle Parallel Server)环境下索引叶块的争用。
当B*Tree索引中有一列是由递增的序列号产生的话,那么这些索引信息基本上分布在同一个叶块,当用户修改或访问相似的列时,索引块很容易产生争用。
反向索引中的索引码将会被分布到各个索引块中,减少了争用。