1 什么是索引
索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据。具体来说:
1.1 索引类似书的目录结构
1.2 Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度
1.3 索引直接指向包含所查询值的行的位置,减少磁盘I/O
1.4 与所索引的表是相互独立的物理结构
1.5 Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引
1.6 语法:CREATE INDEX index ON table (column[, column]...);
1.7 Oracle存储索引的数据结构是B-树,位图索引也是如此,只不过是叶子节点不同B-数索引;索引由根节点、分支节点和叶子节点组成,上级索引块包含下级索引块的索引数据,叶节点包含索引数据和确定行实际位置的rowid。
2 什么是ROWID
ROWID存储了row在数据文件中的具体位置:64位编码的数据,A-Z, a-z, 0-9, +, 和 /; row在数据块中的存储方式:比如,ROwID=OOOOOOFFFBBBBBBRRR,含义是:
OOOOOO:data object number, 对应dba_objects.data_object_id;
FFF:file#, 对应v$datafile.file#;
BBBBBB:block#;
RRR:row#;
3 何时使用索引
3.1 查询返回的记录数
3.2 排序表<40%
3.3 非排序表 <7%
3.4 表的碎片较多(频繁增加、删除)
4 使用索引的目的
4.1 加快查询速度
4.2 减少I/O操作
4.3 消除磁盘排序
5 了解索引的工作原理
表:emp
目标:查询Frank的工资salary
建立索引:create index emp_name_idx on emp(name);
6 索引的分类
6.1 唯一索引
6.1.1 何时创建:当某列任意两行的值都不相同
6.1.2 当建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立
6.1.3 语法:CREATE UNIQUE INDEX index ON table (column);
6.2 组合索引
6.2.1 何时创建:当两个或多个列经常一起出现在where条件中时,则在这些列上同时创建组合索引
6.2.2 组合索引中列的顺序是任意的,也无需相邻。但是建议将最频繁访问的列放在列表的最前面
6.2.3 演示(组合列,单独列)
6.3 位图索引
6.3.1 何时创建:列中有非常多的重复的值时候。例如某列保存了 “性别”信息。 Where 条件中包含了很多OR操作符。较少的update操作,因为要相应的跟新所有的bitmap
6.3.2 结构:位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。
6.3.3 优点:位图以一种压缩格式存放,因此占用的磁盘空间比标准索引要小得多
6.3.4 语法:CREATE BITMAP INDEX index ON table (column[, column]...)
6.3.5 create table bitmaptable as select * from indextable where owner in('SYS','PUBLIC');
6.4 基于函数的索引
6.4.1 何时创建:在WHERE条件语句中包含函数或者表达式时
6.4.2 函数包括:算数表达式、PL/SQL函数、程序包函数、SQL函数、用户自定义函数。
6.4.3 语法:CREATE INDEX index ON table (FUNCTION(column));
7 管理索引的准则
7.1 在表中插入数据后创建索引。在用SQL*Loader或import工具插入或装载数据后,建立索引比较有效;
7.2 索引正确的表和列
7.2.1 经常检索排序大表中40%或非排序表7%的行,建议建索引;
7.2.2 为了改善多表关联,索引列用于联结;
7.2.3 列中的值相对比较唯一;
7.2.4 取值范围(大:B*树索引,小:位图索引);
7.2.5 Date型列一般适合基于函数的索引;
7.2.6 列中有许多空值,不适合建立索引
7.3 为性能而安排索引列
7.3.1 经常一起使用多个字段检索记录,组合索引比单索引更有效;把最常用的列放在最前面,例:dx_groupid_serv_id(groupid,serv_id),在where条件中使用groupid或groupid,serv_id,查询将使用索引,若仅用到serv_id字段,则索引无效;合并/拆分不必要的索引。
7.4 限制每个表索引的数量
7.4.1 一个表可以有几百个索引(你会这样做吗?),但是对于频繁插入和更新表,索引越多系统CPU,I/O负担就越重;建议每张表不超过5个索引。
7.5 删除不再需要的索引
7.5.1 索引无效,集中表现在该使用基于函数的索引或位图索引,而使用了B*树索引;
7.5.2 应用中的查询不使用索引;
7.5.3 重建索引之前必须先删除索引,若用alter index … rebuild重建索引,则不必删除索引。
7.6 索引数据块空间使用
创建索引时指定表空间,特别是在建立主键时,应明确指定表空间;合理设定pctfress,注意:不能给索引指定pctused;。估计索引的大小和合理地设置存储参数,默认为表空间大小,或initial与next设置成一样大。
7.7 考虑并行创建索引
对大表可以采用并行创建索引,在并行创建索引时,存储参数被每个查询服务器进程分别使用,例如:initial为1M,并行度为8,则创建索引期间至少要消耗8M空间;
7.8 考虑用nologging创建索引
7.8.1 对大表创建索引可以使用nologging来减少重做日志;
7.8.2 节省重做日志文件的空间;
7.8.3 缩短创建索引的时间;
7.8.4 改善了并行创建大索引时的性能。
8 怎样建立最佳索引
8.1 明确地创建索引
create index index_name on table_name(field_name)
tablespace tablespace_name
pctfree 5
initrans 2
maxtrans 255
storage
(
minextents 1
maxextents 16382
pctincrease 0
);
8.2 创建基于函数的索引
常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:create index idx_func on emp (UPPER(ename)) tablespace tablespace_name;
8.3 创建位图索引
对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图索引,例: create bitmap index idx_bitm on class (classno) tablespace tablespace_name;
8.4 明确地创建唯一索引
可以用create unique index语句来创建唯一索引,例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;
8.5 创建与约束相关的索引
可以用using index字句,为与unique和primary key约束相关的索引,例如: alter table table_name add constraint PK_primary_keyname primary key (field_name) using index tablespace tablespace_name;据产生大量db file sequential read锁等待;
-----------------------------------------------------------------------------
索引分类:
- 唯一索引,作用是数据约束,保证数据唯一,还有就是数据索引,提高查询效率
- 一般索引,只有数据索引的作用。
唯一索引:
-
create unique index idx_employee_empname on employee(empname);
- create unique index idx_employee_empname on employee(empname);
create unique index idx_employee_empname on employee(empname);
一般索引:
-
create index idx_employee_address on employee(address);
-
create unique index idx_employee_field1_field2 on employee(field1,field2);
- create index idx_employee_address on employee(address);
-
create unique index idx_employee_field1_field2 on employee(field1,field2);
create index idx_employee_address on employee(address);
create unique index idx_employee_field1_field2 on employee(field1,field2);
函数索引:
-
create index idx_product_nvl_price on product(nvl(price,0.0));
- create index idx_product_nvl_price on product(nvl(price,0.0));
create index idx_product_nvl_price on product(nvl(price,0.0));
删除索引:
-
drop index idx_employee_empname;
- drop index idx_employee_empname;
drop index idx_employee_empname;
指定索引表空间
-
create index idx_employee_address on employee(address) tablespace indexs;
- create index idx_employee_address on employee(address) tablespace indexs;
create index idx_employee_address on employee(address) tablespace indexs;
查看索引
-
select * from user_indexes where table_name = 'SHOP_PD'
- select * from user_indexes where table_name = 'SHOP_PD'
相关推荐
本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,我们要理解索引的基本概念。在数据库中,索引类似于书籍的目录,它为数据提供快速访问的途径。...
Oracle 索引是数据库管理系统中提升数据查询速度的关键组件,尤其在大型企业级应用中,选择合适的索引类型对于数据库性能至关重要。本篇文章将深入探讨Oracle中的B*Tree索引、反向索引、降序索引、位图索引和函数...
总的来说,Oracle索引机制的深入理解对于数据库性能调优、查询优化和系统设计都具有重要意义。正确使用索引可以显著提高查询速度,降低响应时间,提升用户体验,但同时也需要平衡索引对写操作的影响,以确保系统的...
### Oracle索引类型详解 #### 一、B\*Tree索引:数据检索的基石 在Oracle数据库中,B\*Tree索引是最常见的索引结构,也是默认创建的索引类型。它基于二叉树原理,由分支块(branch block)和叶块(leaf block)构成,...
Oracle索引被限制的一些情况 Oracle索引是关系数据库管理系统中用于提高查询效率的一种机制,但是索引的使用也存在一些限制。本文将详细介绍一些常见的限制情况,帮助开发人员更好地使用索引,提高查询效率。 限制...
### Oracle索引优化相关知识点详解 #### 一、基本索引概念 在Oracle数据库中,索引是提高数据检索速度的重要工具。通过查询`DBA_INDEXES`视图,可以获取到当前数据库中所有表的所有索引信息。需要注意的是,如果...
Oracle 索引是数据库管理系统中提升数据查询速度的关键技术。本文主要介绍Oracle数据库中不同类型的索引及其内部结构,以及各种索引的工作原理和适用场景。 首先,Oracle使用平衡树(B-Tree)作为其索引的基础结构...
Oracle索引是数据库管理系统中用于加速数据检索的关键结构。它们的工作原理类似于书籍的目录,允许数据库系统快速定位和访问特定的数据行,而无需扫描整个表。Oracle提供了多种类型的索引,包括B树索引、位图索引、...
Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程
总的来说,理解Oracle索引的工作原理并适当使用,是实现数据库高效运行的关键。正确选择和设计索引,避免使用限制索引的因素,能显著提高查询性能,减少数据库响应时间,从而提升整个系统的性能。在实践中,需要结合...
oracle 索引的原理原理深入理解!
Oracle索引优化是数据库性能调优的关键环节,它关乎到数据检索速度和整体系统的效率。在Oracle数据库中,索引的种类繁多,包括B*Tree索引、反向索引、降序索引、位图索引和函数索引等。理解并正确使用这些索引类型...
Oracle 索引与分区索引介绍 Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建...
oracle的索引,非常适合初学者,介绍索引的分类,如何创建,修改等
Oracle数据库中的索引是优化查询性能的关键工具,它允许快速定位和访问数据。常见的索引类型包括B*树索引和位图索引,每种都有其特定的应用场景和优势。 1. **B*树索引**:这是最常见的索引类型,类似于二叉树结构...
### Oracle索引的基本概念 #### 1. 创建索引 索引是数据库中一种用于提高数据检索速度的数据结构。通过创建索引,可以显著提升查询性能。例如,在`student`表上创建一个基于`sno`列的索引: ```sql CREATE INDEX ...