`
czllfy
  • 浏览: 107146 次
  • 来自: ...
社区版块
存档分类
最新评论

Oracle中索引的使用 索引性能优化调整

阅读更多
索引是由Oracle维护的可选结构,为数据提供快速的访问。准确地判断在什么地方需要使用索引是困难的,使用索引有利于调节检索速度。 当建立一个索引时,必须指定用于跟踪的表名以及一个或多个表列。一旦建立了索引,在用户表中建立、更改和删除数据库时, Oracle就自动地维护索引。创建索引时,下列准则将帮助用户做出决定:
       1) 索引应该在SQL语句的"where"或"and"部分涉及的表列(也称谓词)被建立。假如personnel表的"firstname"表列作为查询结果显示,而不是作为谓词部分,则不论其值是什么,该表列不会被索引。
       2) 用户应该索引具有一定范围的表列,索引时有一个大致的原则:如果表中列的值占该表中行的2 0 %以内,这个表列就可以作为候选索引表列。假设一个表有36 000行且表中一个表列的值平均分布(大约每12000行),那么该表列不适合于一个索引。然而,如果同一个表中的其他表列中列值的行在1 0 0 0~1 5 0 0之间(占3 %~4 % ),则该表列可用作索引。

       3)如果在S Q L语句谓词中多个表列被一起连续引用,则应该考虑将这些表列一起放在一个索引内, O r a c l e将维护单个表列的索引(建立在单一表列上)或复合索引(建立在多个表列上)。复合索引称并置索引。

一、主关键字的约束

  关系数据库理论指出,在表中能唯一标识表的每个数据行的一个或多个表列是对象的主关键字。由于数据字典中定义的主关键字能确保表中数据行之间的唯一性,因此,在O r a c l e 8 i数据库中建立表索引关键字有助于应用调节。另外,这也减轻了开发者为了实现唯一性检查,而需要各自编程的要求。

  提示使用主关键字索引条目比不使用主关键字索引检索得快。

  假设表p e r s o n把它的i d表列作为主关键字,用下列代码设置约束:
alter table person add constraint person_pk primary key (id) using index storage (initial 1m next 1m pctincrease 0) tablespace prd_indexes ;

  处理下列S Q L语句时:select last_name ,first_name ,salary from person where id = 289 ;

  在查找一个已确定的“ i d”表列值时, O r a c l e将直接找到p e r s o n _ p k。如果其未找到正确的索引条目,O r a c l e知道该行不存在。主关键字索引具有下列两个独特之处:

 1.1因为索引是唯一的, 所以O r a c l e知道只有一个条目具有设定值。如果查找到了所期望的条目,则立即终止查找。

 1.2一旦遇到一个大于设定值的条目,索引的顺序搜索可被终止;

二、ORDER BY中用索引

  ORDER BY 子句只在两种严格的条件下使用索引.
  ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
  ORDER BY中所有的列必须定义为非空.
  WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

例如:
  表DEPT包含以下列:
dept_code pk not null
dept_desc not null
dept_type null


非唯一性的索引(dept_type) ,
  低效: (索引不被使用)
select dept_code from dept order by dept_type
explain plan: sort order by table access full

  高效: (使用索引)
select dept_code from dept where dept_type > 0
explain plan:
table access by rowid on emp
index range scan on dept_idx

三、避免改变索引列的类型

  当比较不同数据类型的数据时, oracle自动对列进行简单的类型转换.

假设 empno是一个数值类型的索引列:
  select …from emp where empno = '123'
  实际上,经过ORACLE类型转换, 语句转化为: select … from emp where empno = to_number('123')

  幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.

  现在,假设emp_type是一个字符类型的索引列: select … from emp where emp_type = 123
  这个语句被oracle转换为: select … from emp where to_number(emp_type)=123

  因为内部发生的类型转换, 这个索引将不会被用到! 为了避免oracle对你的sql进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, oracle会优先转换数值类型到字符类型.

四、需要当心的where子句

某些select 语句中的where子句不使用索引. 这里有一些例子:

1、IS NULL 与 IS NOT NULL
  不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。
  任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

2、'!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中

不使用索引: select * from employee where salary<>3000;
使用索引: select account_name from transaction where amount >0;
使用索引: select * from employee where salary<3000 or salary>3000;

3、联接列,'||'是字符连接函数. 就象其他函数那样, 停用了索引

不使用索引: select account_name,amount from transaction where account_name||account_type='AMEXA';
使用索引: select account_name,amount from transaction where account_name = 'AMEX' and account_type=' A';

4、'+'是数学函数. 就象其他数学函数那样, 停用了索引

不使用索引: select account_name, amount from transaction where amount + 3000 >5000;
使用索引: select account_name, amount from transaction where amount > 2000 ;

5、相同的索引列不能互相比较,这将会启用全表扫描

不使用索引: select account_name, amount from transaction where account_name = nvl(:acc_name,account_name);
使用索引: select account_name, amount from transaction where account_name like nvl(:acc_name,'%');

6、带通配符(%)的like语句

不使用索引: select * from employee where last_name like '%cliton%';
使用索引: select * from employee where last_name like 'c%'

7、IN和EXISTS

不使用索引: ... where column in(select * from ... where ...);
使用索引: ... where exists (select 'X' from ...where ...);
同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。

如果一定要对使用函数的列启用索引:
1、oracle新的功能: 基于函数的索引(function-based index) 也许是一个较好的方案:
create index emp_i on emp (upper(ename)); /*建立基于函数的索引*/
select * from emp where upper(ename) = 'BLACKSNAIL'; /*将使用索引*/
2、MS SQL Server显示申明指定索引:
SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN ('男','女')

五、怎样监控无用的索引

  Oracle 9i以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引

  语法为:
  开始监控:alter index index_name monitoring usage;
  检查使用状态:select * from v$object_usage;
  停止监控:alter index index_name nomonitoring usage;
  当然,如果想监控整个用户下的索引,可以采用如下的脚本:

set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql

SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;' FROM dba_indexes WHERE owner = USER;

spool off
set heading on
set echo on
set feedback on
------------------------------------------------------------------------------------------------------------------------------
set heading off
set echo off
set feedback off
set pages 10000
spool stop_index_monitor.sql

SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;' FROM dba_indexes WHERE owner = USER;

spool off
set heading on
set echo on
set feedback on
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Oracle索引优化

    Oracle索引优化。Oracle索引优化。Oracle索引优化

    Oracle索引优化相关

    Oracle数据库经典优化之索引原理篇 Oracle中建立索引并强制优化器 基于索引的SQL语句优化之降龙十八掌 30个Oracle语句优化规则详解-性能调优

    ORACLE索引介绍与高性能SQL优化

    ORACLE索引介绍与高性能SQL优化的相关知识

    Oracle 索引 使用方法

    Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程

    ORACLE索引详解及SQL优化

    ORACLE索引详解及SQL优化,详细描述了几种常用索引原理以及创建方法,解读索引生效条件,以及在开发中常用的提高数据库效率、降低数据库资源消耗的方法。

    Oracle DBA手记3-数据库性能优化与内部原理解析 中文版

    “sql 与sql 优化”,分别讲解了sql 的执行计划,sql profile 的使用,以及oracle 中的null 值解析;“内部原理与优化”,分别介绍了oracle 的索引分裂、tx 锁等待、闩锁原理、逻辑读写、隐含参数与latch 原理等的...

    ORACLE索引介绍与高性能SQL优化.pdf

    ORACLE索引介绍与高性能SQL优化.pdf

    Oracle数据库索引优化方法探析.pdf

    Oracle数据库索引优化方法探析.pdf

    oracle中索引的使用

    NULL 博文链接:https://wxz2832840.iteye.com/blog/973305

    oracle的索引学习

    oracle的索引学习,oracle的索引学习,oracle的索引学习

    SQL性能优化以及索引的优化

    SQL性能优化以及索引的优化,索引的优化可以很大提高查询效率,有详细的数据

    数据库 创建索引 sql oracle

    1.索引的创建与使用 2.创建索引的原则 3.索引的分类 4.创建索引的多种方法 5.管理索引 6.索引优化 7.查看、修改索引属性 8.修改索引名 9.删除索引

    oracle数据库索引与sql的优化

    oracle数据库索引与sql的优化介绍了访问oracle数据库的一些优化措施

    oracle 基本索引原理

    oracle 基本索引原理,oracle 学习真必不可少的资料。

    清除Oracle中无用索引

    基于功能的Oracle索引使得数据库管理人员有可能 在数据表的行上过度分配索引。过度分配索引会严重影响关键Oracle数据表的性能。在Oracle9i出现以前,没有办法确定SQL查询没有使用的索引。让我们看看Oracle9i提供了...

    oracle索引使用样例

    个人整理的索引使用的样例 包含 索引并行创建 分区 监测 和索引统计信息

    Oracle+SQL优化之使用索引提示一例

    Oracle+SQL优化之使用索引提示一例

    ORACLE重建索引总结

    3、以删除的叶节点数量:指得是数据行的delete操作从逻辑上删除的索引节点 的数量,要记住oracle在删除数据行后,将 “ 死 “ 节点保留在索引中,这样做可以加快sql删除操作的速度,因此oracle删除数据行后可以不必...

    Oracle高性能SQL调整

    本书由oracle公司授权,向读者...使用oracle8i优化器计划稳定性,基于成本的优化器和基于规则的优化器,调整SQL DML语句、SQL子查询和数据仓库SQL,调整带有临时表和索引的SQL语句,使用STATSPACK诊断和优化系统性能。

    清除Oracle中无用索引 改善DML性能

    虽然这个方法能够让SQL运行得更快速,但是基于功能的Oracle索引使得数据库管理人员有可能在数据表的行上过度分配索引。过度分配索引会严重影响关键Oracle数据表的性能。在Oracle9i出现以前,没有办法确定SQL查询没有...

Global site tag (gtag.js) - Google Analytics