日期:2014-05-16 浏览次数:20637 次
索引,索引的建立、修改、删除?
转自:http://www.cnblogs.com/djcsch2001/articles/1823459.html
?
索引
索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。建立索引是一项技术性要求高的工作。一般在数据库设计阶段的与数据库结构一道考虑。应用系统的性能直接与索引的合理直接有关。下面给出建立索引的方法和要点。
§3.5.1 建立索引
1. CREATE INDEX命令语法:
CREATE INDEX
CREATE [unique] INDEX [user.]index
ON [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处理时,由于要表的存放位置记录到索引项中而会降低一些速度。
注意:一个基表不能建太多的索引;
????? 空值不能被索引
????? 只有唯一索引才真正提高速度,一般的索引只能提高30%左右。
?? Create index ename_in on emp (ename,sal);
例1:商场的商品库表结构如下,我们为该表的商品代码建立一唯一索引,使得在前台POS收款时提高查询速度。
Create table good(good_id number(8) not null,/* 商品条码 */
?????????????????? Good_desc varchar2(40), /* 商品描述 */
?????????????????? Unit_cost number(10,2) /* 单价 */
?????????????????? Good_unit varchar2(6), /* 单位 */
?????????????????? Unit_pric number(10,2) /* 零售价 */
?????????????????? );
注:提高查询速度的方法还有在表上建立主键,主键与唯一索引的差别
在于唯一索引可以空,主键为非空,比如:
Create table good(good_id number(8) primary key,
??????????????????? Good_desc Varchar2(40),
??????????????????? Unit_cost number(10,2),
??????????????????? Good_unit char(6),
??????????????????? Unit_pric number(10,2)
?????????????????? );
§3.5.2 修改索引
对于较早的Oracle版本,修改索引的主要任务是修改已存在索引的存储参数适应增长的需要或者重新建立索引。而Oracle8I及以后的版本,可以对无用的空间进行合并。这些的工作主要是由管理员来完成。
简要语法结构如下,更详细的语法图见电子文档《Oracle8i Reference 》 中的 Alter index.
ALTER [UNIQUE] INDEX [user.]index
[INITRANS n]
[MAXTRANS n]?
REBUILD?
[STORAGE n]
其中:
REBUILD 是 根据原来的索引结构重新建立索引,实际是删除原来的索引后再重新建立。
提示:DBA经常用 REBUILD 来重建索引可以减少硬盘碎片和提高应用系统的性能。
例:
alter index pk_detno rebuild storage(initial 1m next 512k);
ALTER INDEX emp_ix REBUILD REVERSE;
Oracle8i 的新功能可以对索引的无用空间进行合并,它由下面命令完成:
ALTER INDEX . . . COALESCE;
例如:
ALTER INDEX ename_idx COALESCE;
§3.5.3 删除索引
当不需要时可以将索引删除以释放出硬盘空间。命令如下:
DROP INDEX [schema.]indexname
例如:
sql> drop index pk_dept;
注:当表结构被删除时,有其相关的所有索引也随之被删除。
§3.6 新索引类型
Oracle8i为了性能优化而提供新的创建新类型的索引。这些新索引在下面介绍:
§3.6.1 基于函数的索引
基于函数的索引就是存储预先计算好的函数或表达式值的索引。这些表达式可以是算术运算表达式、SQL或PL/SQL函数、C调用等。值得注意的是,一般用户要创建函数索引,必须具有GLOBAL QUERY REWRITE和CREATE ANY INDEX权限。否则不能创建函数索引,看下面例子:
例1:为EMP表的ename 列建立大写转换函数的索引idx :
CREATE INDEX idx ON emp ( UPPER(ename));
这样就可以在查询语句来使用:
SELECT * FROM EMP WHERE UPPER(ename) LIKE ‘JOH%’;
例2:为emp 的工资和奖金之和建立索引:
1) 查看emp 的表结构:
SQL> desc emp
?Name Null? Type
?----------------------------------------- -------- ------------------
?EMPNO NOT NULL NUMBER(4)
?ENAME VARCHAR2(10)
?JOB VARCHAR2(9)
?MGR NUMBER(4)
?HIREDATE DATE
?SAL NUMBER(7,2)
?COMM NUMBER(7,2)
?DEPTNO NUMBER(2)
2)没有授权就创建函数索引的提示:
SQL> create index sal_comm on emp ( (sal+