oracle索引
Oracle索引(Index)介绍使用

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数据库创建索引例子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索引的结构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主键索引和普通索引在关系型数据库中,索引是提高查询效率的重要手段之一。
在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查询表索引语句Oracle是一种关系型数据库管理系统,可以使用SQL语言进行数据查询和操作。
在Oracle中,索引是一种特殊的数据库对象,它可以提高查询效率和数据访问速度。
索引可以根据一个或多个列值进行排序,并且可以通过索引来快速定位到满足查询条件的数据行。
下面列举了一些常用的Oracle查询表索引的语句。
1. 查看表的索引信息:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名';```这个语句可以查询指定表的所有索引,包括索引名称、索引所在的表以及索引列。
2. 查看表的主键索引:```sqlSELECT constraint_name, column_nameFROM all_cons_columnsWHERE table_name = '表名'AND constraint_name = 'PK_表名';```这个语句可以查询指定表的主键索引,包括主键约束名称以及主键列。
3. 查看表的唯一索引:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名'AND uniqueness = 'UNIQUE';```这个语句可以查询指定表的唯一索引,包括索引名称、索引所在的表以及索引列。
4. 查看表的非唯一索引:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名'AND uniqueness = 'NONUNIQUE';```这个语句可以查询指定表的非唯一索引,包括索引名称、索引所在的表以及索引列。
oracle索引,索引的建立、修改、删除

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 查询索引语句一、查询索引定义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索引的原理
Oracle索引是一种数据结构,用于加快数据库查询的速度。
它通过创建一个额外的对象来存储表中某一列(或多列)的键值和指向该行的物理地址的映射关系,以提高查询效率。
Oracle索引使用B树(B-Tree)数据结构实现。
B树是一种平衡的树状结构,每个节点中存储键值和指向子节点的指针。
由于B树的特性,索引树可以高效地支持索引的快速搜索,因为它具有自平衡的性质,平均查询时间复杂度为O(logN),其中N是索引中的节点数。
当在表中创建索引时,Oracle会扫描表的每一行,并提取出索引列的键值,然后按照键值的顺序将它们插入到B树中。
为了提高查询效率,Oracle还可以使用一些技术来优化索引的性能,如压缩、分区等。
在执行查询时,Oracle会使用索引树进行搜索,以找到满足查询条件的所有行。
它首先从根节点开始搜索,根据查询条件选择相应的分支,然后逐级向下搜索,直到找到叶子节点或满足查询条件的节点。
最终,根据叶子节点中存储的指向行的物理地址,Oracle可以快速定位到满足查询条件的行。
除了提高查询速度外,索引还可以用于加速表的排序和连接操作。
通过优化索引的设计和使用,可以显着提升数据库的性能和响应时间。
需要注意的是,虽然索引可以提高查询的速度,但它也会占用
额外的存储空间,并增加数据插入、更新和删除的开销。
因此,在设计和使用索引时,需要权衡查询效率和存储空间的消耗,以达到最佳的性能优化效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高10000倍,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能。
索引的管理成本1、存储索引的磁盘空间2、执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护3、在数据处理时回需额外的回退空间。
实际数据修改测试:一个表有字段A、B、C,同时进行插入10000行记录测试在没有建索引时平均完成时间是2.9秒在对A字段建索引后平均完成时间是6.7秒在对A字段和B字段建索引后平均完成时间是10.3秒在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒从以上测试结果可以明显看出索引对数据修改产生的影响索引按存储方法分类B*树索引B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。
一般索引及唯一约束索引都使用B*树索引。
位图索引位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。
位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。
在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。
索引按功能分类唯一索引唯一索引有两个作用,一个是数据约束,一个是数据索引,其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。
主关键字索引主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。
一般索引一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。
索引按索引对象分类单列索引(表单个字段的索引)多列索引(表多个字段的索引)函数索引(对字段进行函数运算的索引)建立函数索引的方法:create index 收费日期索引on GC_DFSS(trunc(sk_rq))create index 完全客户编号索引on yhzl(qc_bh||kh_bh)在对函数进行了索引后,如果当前会话要引用应设置当前会话的query_rewrite_enabled为TRUE。
alter session set query_rewrite_enabled=true注:如果对用户函数进行索引的话,那用户函数应加上deterministic参数,意思是函数在输入值固定的情况下返回值也固定。
例:create or replace function trunc_add(input_date date)return date deterministicasbeginreturn trunc(input_date+1);end trunc_add;应用索引的扫描分类INDEX UNIQUE SCAN(按索引唯一值扫描)select * from zl_yhjbqk where hbs_bh='5420016000'INDEX RANGE SCAN(按索引值范围扫描)select * from zl_yhjbqk where hbs_bh>'5420016000'select * from zl_yhjbqk where qc_bh>'7001'INDEX FAST FULL SCAN(按索引值快速全部扫描)select hbs_bh from zl_yhjbqk order by hbs_bhselect count(*) from zl_yhjbqkselect qc_bh from zl_yhjbqk group by qc_bh什么情况下应该建立索引表的主关键字自动建立唯一索引如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)表的字段唯一约束ORACLE利用索引来保证数据的完整性如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)直接条件查询的字段在SQL中用于条件约束的字段如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)select * from zl_yhjbqk where qc_bh=’7001’查询中与其它表关联的字段字段常常建立了外键关系如zl_ydcf(用电成份)中的jldb_bh(计量点表编号)select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’查询中排序的字段排序的字段如果通过索引去访问那将大大提高排序速度select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)select * from zl_yhjbqk where qc_bh='7001' order by cb_sx(建立qc_bh+cb_sx索引,注:只是一个索引,其中包括qc_bh和cb_sx字段)查询中统计或分组统计的字段select max(hbs_bh) from zl_yhjbqkselect qc_bh,count(*) from zl_yhjbqk group by qc_bh什么情况下应不建或少建索引表记录太少如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下ORACLE 至少要往返读取数据块两次。
而不用索引的情况下ORACLE会将所有的数据一次读出,处理速度显然会比用索引快。
如表zl_sybm(使用部门)一般只有几条记录,除了主关键字外对任何一个字段建索引都不会产生性能优化,实际上如果对这个表进行了统计分析后ORACLE也不会用你建的索引,而是自动执行全表访问。
如:select * from zl_sybm where sydw_bh='5401'(对sydw_bh建立索引不会产生性能优化)经常插入、删除、修改的表对一些经常处理的业务表应在查询允许的情况下尽量减少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等业务表。
数据重复且分布平均的表字段假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
经常和主字段一块查询但主字段索引值比较多的表字段如gc_dfss(电费实收)表经常按收费序号、户标识编号、抄表日期、电费发生年月、操作标志来具体查询某一笔收款的情况,如果将所有的字段都建在一个索引里那将会增加数据的修改、插入、删除时间,从实际上分析一笔收款如果按收费序号索引就已经将记录减少到只有几条,如果再按后面的几个字段索引查询将对性能不产生太大的影响。
如何只通过索引返回结果一个索引一般包括单个或多个字段,如果能不访问表直接应用索引就返回结果那将大大提高数据库查询的性能。
对比以下三个SQL,其中对表zl_yhjbqk的hbs_bh 和qc_bh字段建立了索引:1 select hbs_bh,qc_bh,xh_bz from zl_yhjbqk where qc_bh=’7001’执行路径:SELECT STATEMENT, GOAL = CHOOSE 11 265 5565TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 5565INDEX RANGE SCAN DLYX 区册索引1 265平均执行时间(0.078秒)2 select hbs_bh,qc_bh from zl_yhjbqk where qc_bh=’7001’执行路径:SELECT STATEMENT, GOAL = CHOOSE 11 265 3710TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 3710INDEX RANGE SCAN DLYX 区册索引1 265平均执行时间(0.078秒)3 select qc_bh from zl_yhjbqk where qc_bh=’7001’执行路径:SELECT STATEMENT, GOAL = CHOOSE 1 265 1060INDEX RANGE SCAN DLYX 区册索引1 265 1060平均执行时间(0.062秒)从执行结果可以看出第三条SQL的效率最高。
执行路径可以看出第1、2条SQL都多执行了TABLE ACCESS BY INDEX ROWID(通过ROWID访问表) 这个步骤,因为返回的结果列中包括当前使用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3条SQL直接通过QC_BH返回了结果,这就是通过索引直接返回结果的方法。
如何重建索引alter index 表电量结果表主键rebuild如何快速新建大数据量表的索引如果一个表的记录达到100万以上的话,要对其中一个字段建索引可能要花很长的时间,甚至导致服务器数据库死机,因为在建索引的时候ORACLE要将索引字段所有的内容取出并进行全面排序,数据量大的话可能导致服务器排序内存不足而引用磁盘交换空间进行,这将严重影响服务器数据库的工作。
解决方法是增大数据库启动初始化中的排序内存参数,如果要进行大量的索引修改可以设置10M以上的排序内存(ORACLE 缺省大小为64K),在索引建立完成后应将参数修改回来,因为在实际OLTP数据库应用中一般不会用到这么大的排序内存。