网站首页 > 文章中心 > 其它

oracle怎么使用索引_Oracle修改索引

作者:小编 更新时间:2023-10-23 19:16:28 浏览量:69人看过

oracle中怎么建立和使用索引

在程序中,oracle优化器在认为索引效率更高时,会自动调用索引.

也可以显式调用索引:

select

/*+index(A,索引名)*/

*

from

A

where

b='',c='';

oracle的索引是怎么使用的?

索引就像书的目录一样,是为了方便查询的.一般在数据表记录很多的时候建立索引,oracle的索引有哈希索引和聚簇索引

oracle怎么通过索引查询数据语句

Oracle使用(九)_表的创建/约束/索引

表创建标准语法:

CREATE TABLE [schema.]table

(column datatype [DEFAULT expr] , ...);

--设计要求:建立一张用来存储学生信息的表,表中的字段包含了学生的学号、姓名、年龄、入学日期、年级、班级、email等信息,

--并且为grade指定了默认值为1,如果在插入数据时不指定grade得值,就代表是一年级的学生

--DML是不需要commit的,隐式事务

create table student

(

stu_id number(10),

hiredate date,

);

--DML 需要收到commit

select * from student;

-- 给表添加列,添加新列时不允许为not null,因为与旧值不兼容

alter table student add address varchar(100);

-- 删除列

alter table student drop column address;

--修改列

正规表设计使用power disinger

--表的重命名

rename student to stu;

-- 表删除

drop table stu;

**

在删除表的时候,经常会遇到多个表关联的情况(外键),多个表关联的时候不能随意删除,使用如下三种方式:

约束:创建表时,指定的插入数据的一些规则

约束是在表上强制执行的数据校验规则

Oracle 支持下面五类完整性约束:

①.). NOT NULL 非空约束 ---- 插入数据时列值不能空

-- 添加主键约束/not null约束/check约束/唯一键约束

stu_id number(10) primary key,

-- 添加外键约束

create table stu

FOREIGN KEY(deptno) references dept(deptno)

-- 创建表时没添加外键约束 也可以修改 其中fk_0001为外键名称

alter table student add constraint fk_0001 foreign key(deptno) references dept(deptno);

索引创建有两种方式:

组合索引:多个列组成的索引

--索引:加快数据剪碎

create index i_ename on emp(ename);

--当创建某个字段索引后,查询某个字段会自动使用到索引

select * from emp where ename = 'SMITH';

--删除索引 索引名称也是唯一的

drop index i_ename;

一些概念:

回表:

覆盖索引

组合索引

最左匹配

Oracle数据访问和索引的使用

- 通过全表扫描的方式访问数据;

- 通过ROWID访问数据;

- 通过索引的方式访问数据;

- Oracle顺序读取表中所有的行,并逐条匹配WHERE限定条件.

- 采用多块读的方式进行全表扫描,可以有效提高系统的吞吐量,降低I/O次数.

- 即使创建索引,Oracle也会根据CBO的计算结果,决定是否使用索引.

注意事项:

- 只有全表扫描时才可以使用多块读.该方式下,单个数据块仅访问一次.

- 对于数据量较大的表,不建议使用全表扫描进行访问.

- Rowid是数据存放在数据库中的物理地址,能够唯一标识表中的一条数据.

- Rowid指出了一条记录所在的数据文件、块号以及行号的位置,所以呢通过ROWID定位单行数据是最快的方法.

- Rowid作为一个伪列,其数值并不存储在数据库中,当查询时才进行计算.

- 通过索引查找相应数据行的Rowid,再根据Rowid查找表中实际数据的方式称为"索引查找"或者"索引扫描".

- 一个Rowid对应一条数据行(根据Rowid查找结果,仅需要对Rowid相应数据的数据块进行一次I/O操作),所以呢该方式属于"单块读".

- 对于索引,除了存储索引的数据外,还保存有该数据对应的Rowid信息.

- 对于选择性高的数据行,索引的使用会提升查询的性能.但对于DML操作,尤其是批量数据的操作,可能会导致性能的降低.

- 全表扫描的效率不一定比索引扫描差,关键看数据在数据块上的具体分布.

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

(1) 单列索引

单列索引是基于单个列所建立的索引.

复合索引是基于两列或是多列的索引,在同一张表上可以有多个索引,但是要求列的组合必须不同.

(1) 重命名索引

(表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,无需额外存储空间,代价较低)

方式一:删除原来的索引,重新建立索引

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

例如:

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

方式二: Alter index 索引名称 rebuild;

- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.

- 索引可以大大加快数据的检索速度,这是创建索引的最主要的原因.

- 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义.

- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间.

- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能.

- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加.

- 除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大.

- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度.

- 更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性.

①.) 不恰当的索引不但于事无补,反而会降低系统性能.因为大量的索引在进行插入、修改和删除操作时比没有索引花费更多的系统时间.

①.) 应该建索引的列

- 在经常需要搜索的列上,可以加快搜索的速度;

- 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

- 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

- 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

- 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

- 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度.

- 在大表上建立索引才有意义,小表无意义.

- 对于那些在查询中很少使用或者参考的列不应该创建索引.

- 对于那些只有很少数据值的列也不应该增加索引.比如性别,在查询的结果中,结果集的数据行占了表中数据行的很大比例,.增加索引,并不能明显加快检索速度.

- 对于那些定义为blob数据类型的列不应该增加索引.这是因为,这些列的数据量要么相当大,要么取值很少.

- 当修改性能远远大于检索性能时,不应该创建索引.

一个表中有几百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这主要可能是oracle的索引限制造成的.Oracle的索引有一些索引限制,在这些索引限制发生的情况下,即使已经加了索引,oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差.

下面的查询即使在djlx列有索引,查询语句仍然执行一次全表扫描.

把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引.

特别注意:通过把不等于操作符改成OR条件,就可以使用索引,避免全表扫描.

使用IS NULL或IS NOT NULL同样会限制索引的使用.所以呢在建表时,把需要索引的列设成NOT NULL.如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引).

如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引. 下面的查询不会使用索引(只要它不是基于函数的索引)

因为Oracle会自动把查询语句改为

特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次"全表扫描".

(1) 索引无效

以上就是土嘎嘎小编为大家整理的oracle怎么使用索引相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章