索引概述

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

索引的目的

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. 53. Maximum Subarray
  2. 电子白板技术_电子白板种类介绍及产品功能概述
  3. 无网络状态下修改计算机ip,电脑突然没有网络的到底是什么原因,查看ip地址...
  4. 计算机选修课学什么,计算机专业都学什么 主要课程有什么
  5. 【机器学习】 - 目标检测 - VOC格式数据集介绍与自己制作
  6. LeetCode 345. Reverse Vowels of a String
  7. oracle中只存储两年数据,Oracle中作为永久存储机制的嵌套表的数据追加
  8. openstack-o版-nova安装
  9. 数据结构-03-队列
  10. JavaSE基础-02-接口
  11. 【存档】使用OllyDbg+ResHack+LordPE来修改EXE文件
  12. 第二个项目前预演,完成了,(第6200小时的时候)
  13. ads1115与树莓派
  14. Dual-edge triggered flip_flop(Dualedge)
  15. (五十七)方差分析与相关分析
  16. 双重认证怎么开_facebook bm认证很重要
  17. IE浏览器提示安全证书过期怎么办
  18. Blender游戏开发教程
  19. c盘扩容(亲测有效)+软件已备好
  20. Python爬虫-利用xpath解析爬取58二手房详细信息

热门文章

  1. 【vs调试】PDB文件:每个开发人员都必须知道的
  2. LLVM LTO与ThinLTO总结
  3. JZOJ5904刺客信条
  4. 认识Json本质 一个较复杂Json串的解析实例
  5. 使用Tushare平台提供的数据绘制日K线、周K线、月K线
  6. 数据分析之python数据计算方法汇总(math|numpy|pandas)
  7. 友盟第三方QQ登录,报错注意,使用友盟社会化组件的微博SSO功能,需要按照文档要求在xcode设置url scheme!
  8. PBI中使用SVG自定义折线缩略图
  9. 西安交大2020年秋 在线作业及答案
  10. 13. Fabric2.2 区块链农产品溯源系统 - 智能合约调试