索引概述

索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。建立索引是一项技术性要求高的工作。一般在数据库设计阶段的与数据库结构一道考虑。应用系统的性能直接与索引的合理直接有关。下面给出建立索引的方法和要点。

索引的目的

1、提高对表的查询速度;

2、对表有关列的取值进行检查。

注意事项

1、当然索引也是一把双刃剑,虽然能够加快查询的速度,但也会降低对insert、update、delete的处理速度(因为要将表的存放位置记录到索引项中。),所以一个基表不能建太多的索引;

2、空值不能被索引

3、只有唯一索引才真正提高速度,一般的索引只能提高30%左右。

索引建立语法:

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 不(能)排序(存储时就已按升序,所以指出不再排序)

例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)

);

例2:

create unique index pk_dfnd_org_msg_spec on dFnd_org_msg_spec(acct_id) tablespace SYSTEM_INDEX

pctfree 10

initrans 2

maxtrans 255

storage

(

initial 50M

next 50M

minextents 1

maxextents unlimited

pctincrease 0

);

修改索引

对于较早的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;

删除索引

当不需要时可以将索引删除以释放出硬盘空间。命令如下:

DROP INDEX [schema.]indexname

例如:

sql> drop index pk_dept;

注:当表结构被删除时,有其相关的所有索引也随之被删除。

新索引类型

Oracle8i为了性能优化而提供新的创建新类型的索引。这些新索引在下面介绍:

基于函数的索引

基于函数的索引就是存储预先计算好的函数或表达式值的索引。这些表达式可以是算术运算表达式、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+comm)*12, sal,comm)

2 tablespace users storage(initial 64k next 64k pctincrease 0);

create index sal_comm on emp ( (sal+comm)*12, sal,comm)

*

ERROR at line 1:

ORA-01031: insufficient privileges

3) 连接到DBA帐户并授权:

SQL> connect sys/sys@ora816

Connected.

SQL> grant GLOBAL QUERY REWRITE to scott;

Grant succeeded.

SQL> grant CREATE ANY INDEX to scott;

Grant succeeded.

4)在连接到scott帐户,创建基于函数的索引:

SQL> connect scott/tiger@ora816

Connected.

SQL> create index sal_comm on emp ( (sal+comm)*12, sal,comm)

2 tablespace users storage(initial 64k next 64k pctincrease 0);

Index created.

5)在查询中使用函数索引:

SQL> select ename,sal,comm from emp where (sal+comm)*12 >5000;

ENAME SAL COMM

———————- —————- —————-

ALLEN 1600 300

WARD 1250 500

MARTIN 1250 1400

TURNER 1500 0

赵元杰 1234.5 54321

反向键索引

反向键索引通过反向键保持索引的所有叶子键上的插入分布。有时,可用反向键索引来避免不平衡的索引。对于反向键索引可以进行下面操作:

1.通过在ALTER INDEX命令后加REBUILD NOREVERSE或REBUILD REVERSE子句来使索引边为反向键索引或普通索引;

2、采用范围扫描的查询不能使用反向键索引;

3、位图索引不能反向;

4、索引编排表不能反向。

例1:创建一个反向键索引:

CREATE INDEX i ON t (a,b,c) REVERSE;

例2:使一个索引变为反向键索引:

ALTER INDEX i REBUILD NOREVERSE;

索引组织表

与普通的索引不一样,索引组织表(Index_Organized Table)是根据表来存储数据,即将索引和表存储在一起。这样的索引结构表(Index_organized table—IOT)的特点是:对表数据的改变,如插入一新行、删除某行都引起索引的更新。

索引组织表就象带一个或多个列所有的普通表一样,但索引组织表在B-树索引结构的叶节点上存储行数据。通过在索引结构中存储数据,索引组织表减少了总的存储量,此外,索引组织表也改善访问性能。

由于表中的行与B_树索引存放在一起,每个行都没有ROWID,而是用主键来标识。但是Oracle会“猜”这些行的位置并为每个行分配逻辑的ROWID。此外,你可以为这样的表建立第二个索引。

创建索引结构表也是用CREATE TABLE 命令加ORGANIZATION INDEX关键字来实现。但是,这样的表在创建完后,你还必须为该表建立一个主键。

例子:

CREATE TABLE IOT_EXPAMPLE

(

Pk_col1 number(4),

Pk_col2 varchar2(10),

Non_pk_col1 varchar2(40),

Non_pk_col2 date,

CONSTRAINT pk_iot PRIMARY KEY

( pk_col1, pk_col2)

)

ORGANIZATION INDEX

TABLESPACE INDEX

STORAGE( INITIAL 1M NEXT 512K PCTINCREASE 0 );

索引组织表有些限制:

1、不能使用唯一约束;

2、必须具有一个主键;

3、不能建立簇;

4、不能包含LONG类型列;

5、不支持分布和复制。

提示:如果建立了索引组织表,则会在DBA_TABLES中的IOT_TYPE和IOT_NAME列上记录有索引组织表的信息。

例1.修改索引结构表 docindex 的索引段的INITRANS参数:

ALTER TABLE docindex INITRANS 4;

例2.下面语句加一个的溢出数据段到索引组织表 docindex中:

ALTER TABLE docindex ADD OVERFLOW;

例3.下面语句为索引组织表 docindex的溢出数据段修改INITRANS参数:

ALTER TABLE docindex OVERFLOW INITRANS 4;

oracle 与indexc函数,oracle索引知识小结相关推荐

  1. oracle关于字符串函数,Oracle字符串处理函数

    Oracle字符串处理函数 Oracle字符串处理函数 2008年10月18日 星期六 23:45 项目中有涉及存储过程对字符串的处理,所以就将在网上查找到的资料汇总,做一个信息拼接式的总结. 以下信 ...

  2. oracle 实现基于函数的索引

    使用场景: 当一个查询运行很慢.通过检查where子句,发现其中的一列应用了sql lower函数,lower函数 阻止使用该列上现有的索引.你想要创建一个基于函数索引来支持这个查询,如下 SQL&g ...

  3. oracle对象权限 函数,oracle的系统和对象权限

    alter any cluster 修改任意簇的权限 alter any index 修改任意索引的权限 alter any role 修改任意角色的权限 alter any sequence 修改任 ...

  4. oracle中各种函数,oracle中常用函数大全

    1.数值型常用函数 函数 返回值 样例 显示 ceil(n) 大于或等于数值n的最小整数 select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数 s ...

  5. oracle中lead函数,oracle lead()函数 | 学步园

    ead()是一个分析函数,适用于oracle 8i以后的版本, 使用这个函数,你可以一次性从表中查询多条记录, 而不需要进行表的自连接. 返回值:返回与当前行偏离offset行的列值. 语法: lea ...

  6. oracle的连接函数,Oracle各种连接函数总结

    1.前言 Oracle可用连接函数会介绍以下几个 Oracle列转行函数 Listagg() strcat() wmsys.wm_concat() 2.Oracle列转行函数 Listagg() 2. ...

  7. oracle调用MySQL函数,Oracle的INSTR函数MySQL实现

    Oracle的INSTR函数MySQL实现 一个迁移项目遇到的,MySQL的instr函数只能查找子串是否在父串中,没法按照出现的次数进行查找.这里我自己写了一个,以便迁移.当然我这里仅仅针对的是迁移 ...

  8. oracle中转换函数,Oracle中的转换函数

    Oracle中的转换函数有三个,分别为to_char(),to_date(),to_number() 1.to_char()的用法 格式化当前的日期时间 select sysdate,to_char( ...

  9. oracle查看时间戳函数,oracle数据库实现获取时间戳的无参函数

    oracle数据库实现获取时间戳的无参函数 代码如下所示: CREATE OR REPLACE FUNCTION GETMSTIMESTAMP RETURN NUMBER AS MSTIMESTAMP ...

最新文章

  1. IEEE-754标准(32位) 十六进制转换十进制浮点数
  2. 接入腾讯云短信服务(史上最详细+该短信服务如何申请成功+发送短信验证码API讲解+相关错误分析)
  3. php生成图片验证码-附五种验证码
  4. 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab
  5. ssl1335-最佳派对【二分图,最大匹配,图论】
  6. android开源tabview,TabBarView
  7. 软件测试笔试Linux题,linux基础面试题
  8. anaconda pycharm_搭建 Python 高效开发环境: Pycharm + Anaconda
  9. 2016.01.10 论文扩充、精修、查重
  10. cmake导入so库_(转)HelloWorld CMake CMake中构建静态库与动态库及其使用
  11. 计算机信息与自然科学,郑旭飞 - 计算机与信息科学学院 - Powered by 西南大学
  12. 台达伺服b3设置_台达伺服调机步骤简易说明书.pdf
  13. java实例化对象的四种方式
  14. 图测1.0 在线地图测量与高清卫星图App 发布
  15. X509和CA的关系
  16. 记录一个换了intel+主板换成 AMD 5800X之后蓝屏问题
  17. 纯真ip数据库 转mysql_如何把纯真ip数据库导入到MySQL数据表中
  18. 给力回馈!亲~时间有限哦!
  19. 复杂表格巧拆分(转)
  20. 移动联通电信4g和移动4g有什么区别

热门文章

  1. 国内电脑行业数据浅析
  2. php 抽奖思路,PHP抽奖算法思路?
  3. Float Point Exception
  4. 如何让2007Office兼容低版本的文档?
  5. java代码解压rar文件时报错,badRarArchive
  6. python查找文字在图片中的位置_一键给图片添加上文字、诗词和歌词|还有百万句子库可供查找...
  7. python人脸识别opencv_体验opencv进行人脸识别(基于python)
  8. 【父母必知】呼吸过敏知多少
  9. CAD快速入门技巧:CAD软件中撤销操作的方法汇总
  10. 微信小程序基础知识 || 如何让微信开发者工具显示切后台按键