Oracle Indexes(索引)
来源:互联网 发布:手机变电脑软件 编辑:程序博客网 时间:2024/05/21 15:44
一、为什么引入索引:提高查询的效率,加快查询速度。
在计算机的所有操作当中,I/O操作应该是最慢的,使用索引减少了I/O操作就等于加快了查询的速度。
二、建立、查看、删除索引
1、建立索引的两种方式:
A、Oracle系统自动建立:当用户在一个表上建立逐渐(Primary Key)或惟一(UNIQUE)约束时,Oracle系统会自动创建唯一索引(UNIQUE INDEX)。
主键约束:ALTER TABLE tableName ADD CONSTRAINT constraintName PRIMARY KEY(col1,.....);
唯一约束:ALTER TABLE tableName ADD CONSTRAINT constraintName UNIQUE(col1,.....);
B、手工建立:用户在一个表中的一列或多列上用Create Index语句来创建非唯一索引(NONUNIQUE INDEX)。
普通索引:CREATE INDEX indexName ON tableName (列名|表达式[,列名|表达式]...);
Oracle 公司推荐的索引命名方式:表名_列名_对象的类型,比如ORDER_ORDERNO_IDX 。
示例:CREATE INDEX order_orderno_idx ON order (order_no);
CREATE INDEX order_orderno_idx ON order (UPPER(order_no)); --函数索引
CREATE INDEX order_adddte_idx ON order (add_dte-7); --函数索引
注:SELECT * FROM order WHERE add_dte>sysdate-1不走如上索引,因为左侧不是add_dte-7;
若用add_dte建索引,add_dte-7>sysdate-10不走该索引,当add_dte>sysdate-3才会使用。
2、建立索引的几点指导原则(当下列条件之一成立时;反过来说就是什么时候不应该建立索引):
1)表很大而且大多数查询的返回数据量很少(Oracle推荐为小于总函数的百分之二到百分之四),因为如果返回数据量很大的话就不如顺序地扫描整个表了;
2)此列的取值范围很广,一般为随机分布;
3)一列或多列经常出现在WHERE子句或连接条件中;
4)表上的DML操作较少;
5)此列中包含了大量的空值(NULL);
6)此列不经常作为SELECT语句中的某个表达式的一部分;
3、查看索引:
1)查看索引概况:从视图USER(或ALL或DBA)_INDEXES中查询
常见列:INDEX_NAME:索引名称
INDEX_TYPE:索引类型,包含LOB,NORMAL,FUNCTION-BASED NORMAL。
函数索引在视图中列名格式为SYS_NC00000$
TABLE_NAME:建立索引的表的名称
UNIQUENES:唯一索引或者非唯一索引,值为UNIQUE或NONUNIQUE
STATUS:VALID,INVALID
2)查看索引列:从视图USER(或ALL或DBA)_IND_COLUMNS中查询
常见列:INDEX_NAME:索引名称
TABLE_NAME:建立索引的表的名称
COLUMN_NAME:使用索引的列名
COLUMN_POSITION:索引列顺序,单值索引为1,复合索引为1,2,3,....
3)使用执行计划查看索引是否在一个语句中使用:
如果没有找到plan_table,需要执行$ORACLE_HOME\rdbms\admin\utlxplan下的这个脚本。
使用命令:SQL>EXPLAIN PLAN FOR sql语句 ;
最后查询SELECT * FROM plan_table;即可看到执行计划。
一般使用的列:SELECT id,operation,options,object_name,position FROM plan_table;
4)查看索引使用情况:
ALTER INDEX cust_name_idx MONITORING USAGE;(9i以后版本)
这个命令开销很小,之后可以使用V$OBJECT_USAGE视图和USAGE字段(值为YES和NO)来判断索引是否被访问过。得到批量监控语句的方法如下:
SQL>set pages 999
SQL>set heading off
SQL>spool run_mon.sql
SQL>select 'alter index ' || index_name || ' monitoring usage;' from dba_indexes where owner = 'XXX';
SQL>spool off
SQL>@run_mon
对于Oracle9i之前的版本,监控索引使用的唯一方法是执行他们的程序库缓中的所有SQL,然后手工记下所有被使用的索引。
4、删除索引:DROP INDEX 索引名;
该DDL将从数据字典中删除索引的定义,并释放这个索引所占用的磁盘空间。
所需权限:索引的所有者或具有DROP ANY INDEX的系统权限。
其它用处:DBA向数据库导入大量数据时,可以先删除索引,导完后再重建索引。
三、索引的存储结构(待续...)
四、使用索引的注意事项
避免在一个表上创建过多的索引(Over Indexes),尤其对DML操作频繁的表,过多索引会大大降低DML操作的速度。要控制索引的数量,在查询速度与DML操作速度之间做出折中。
- Oracle Indexes(索引)
- 第八章 ORACLE 索引 INDEXES (一)
- DB2 indexes(索引)
- ORACLE 返向索引 Reverse Key Indexes
- Oracle PL/SQL之函数索引(Function-based indexes)使用示例
- 【技能库】--mysql indexes 索引操作(195)
- 浅谈MSSQL2012中的列存储索引(columnstore indexes)
- Detecting duplicate Oracle indexes
- MongoDB 部分索引(Partial Indexes)
- Oracle 11g 新特性 -- Invisible Indexes(不可见的索引) 说明
- Oracle 11g 新特性 -- Invisible Indexes(不可见的索引) 说明
- Oracle 12C 新特性之表分区部分索引(Partial Indexes)
- 你的索引被有效的使用了吗?(Are Your Indexes Being Used Effectively?)
- 检查SQL Server2005中的重叠索引(Detecting Overlapping Indexes in SQL Server 2005)
- Mysql show indexes 查看索引状态
- 8.3.4 Column Indexes 列索引
- 8.3.4 Column Indexes 列索引
- MongoDB 稀疏(间隙)索引(Sparse Indexes)
- Leetcode 171. Excel Sheet Column Number
- 策略模式
- 度量快速开发平台网格勾选行(标识行),多选行获取方法
- 浅析Java中的XML
- 2016年求职找工作千万小心这些求职陷阱
- Oracle Indexes(索引)
- Win7硬盘安装CentOS7双系统
- 整理GCD用法
- Sublime text 的配置
- ping程序
- 数据结构与算法分析(二) —— 关于表、栈和队列的深入探讨
- 加入VR技术行业之前 你所要知道的
- iOS多线程使用总结
- oracle数据库表,索引创建实例