`
danielhjd
  • 浏览: 242559 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

(Index)Oracle 中Index的运行机制

阅读更多

从表单访问数据时,Oracle提供了两种方法 a.全表扫描(从表中读取每一行);b.通过ROWID一次读取一行;

索引改进性能的程度部分取决于数据的选择性以及在表的块之间分布数据的方式

 

数据的选择性:

如果数据非常具有选择性,即只有很少的行匹配索引值(for instance PassPort Id).Oracle能快速查询的匹配索引值的RowID索引,并且可以快速查询少量的相关表块。

如果数据不是非常具有选择性(例如国家名),则索引可能返回许多ROWID,导致从表中查询许多单独的块。

 

如果数据非常具有选择性,但是相关的行在表中的存储位置并不互相靠近,则会进一步减少索引的益处。

如果匹配索引值的数据分散在表的多个块中,则必须从表中选择多个单独的块以满足查询。

 

在一些情况中,您会发现当数据分散在表的多个块中时,最好是不使用索引,而是执行全表扫描

 

执行全表扫描时,Oracle使用多块读取以快速扫描表。

执行索引的读取是Oracle使用单块读取,因此在使用索引时的目标是减少解决查询所需的单个块的数量。

 

通过使用Oracle中的一些可用选项,比如分区、并行DML、并行查询操作以及使用db_file_multiblock_read_count进行更大的I/O操作,全表扫描索引查找之间的平衡点发生了改变。硬件更为快速,磁盘可以在磁盘上的高速缓存中缓存更多的信息,内存也变得更为廉价。与此同时,Oracle已经增强的索引特性,包括了跳跃式扫描索引其他减少检索数据所需时间的操作

 

Index的优点:

索引通常能提高查询的性能。SELECT语句、UPDATE和DELETE命令的WHERE子句的性能(当访问的行较少时)可以从索引中获益。

 

Index的缺点:

1)增加索引会降低INSERT语句的性能,因为需要同时对表和索引进行插入。

2)索引列的UPDATE操作将会减慢执行速度,因为数据库必须管理对表和索引的改动。

3)大量行的DELETE操作将会由于表中存在索引而减慢执行速度。

备注:

表中的每个索引都会使对表执行的INSERT操作变慢两倍;

使用两条索引通常会使插入操作变慢一倍;

一个由两部分组成的单一索引并不比只有一个部分组成的单一索引差很多;

 

如何创建和查看索引:

--创建索引  建立索引时最好只写columns的名 如果格式table_name.columns_name会无法识别,在同一张表中创建了两个index--
create index index_emp on employees(salary) 
create index index_emp2 on employees(employee_id,first_name,email)

--查看索引--

--a.获取不了数据--
select table_name,index_name from user_indexes where table_name= 'employees'
--b.获取的了数据--
select table_name,index_name from user_indexes where table_name='EMPLOYEES'

---在Oracle数据库中Column和关键字是不区分大小写的,而在查询内容即数据中要区分大小写

     当发出这些命令时,数据库将在EMP表上创建两个单独的索引。每个索引将包含employees表中的指定值以及匹配指定值的行的ROWID值。如果需要查找Sal值为1000的employees记录,优化器就会使用index_emp索引查找该值,在索引中查找相关的ROWID,并且使用该ROWID在表中查找正确的行

结果:



 

获得给定表中被索引的特定列,可访问USER_IND_COLUMNS视图。同样需要注意的是,DBA可以通过访问DBA_IND_COLUMNS视图检索所有模式中被索引的列,而通过访问ALL_IND_COLUMNS视图则可以查看所有表的索引列。

select table_name,index_name,column_name,column_position from user_ind_columns where table_name='EMPLOYEES' order by table_name,index_name,column_position;

 

 

结果:



 

index_emp2是一个组合(concatenated)索引(复合索引),它对employee_id,first_name,email这几列进行索引。显示在程序清单中的Column_Position显示了组合索引中的列顺序,即按照Empno、Ename和Deptno的顺序。

index_emp只对Sal列进行索引。

组合索引:当某个索引包含有多个已索引的列时,我们称这个索引为组合(concatenated)索引或是复合索引。Oracle 9i引入的跳跃式扫描索引访问方法增强了,优化器在使用组合索引时的选择,但是您应该谨慎地选择索引中的列顺序。一般来说,索引的第一列应该是最有可能在WHERE子句中使用的列,并且也是索引中最具选择性的列。(Oracle的优化器在执行索引时是按照索引的column_position来顺序执行的);

 

      如果没有使用跳跃式扫描功能,除非在WHERE子句中对第一列(Empno)指定一个值,否则Oracle一般不会使用这个索引。

select * from employees where employees.first_name='irs'

     因为employees.first_name不是索引的第一列,优化器可能会选择不使用该索引。随着在Oracle 9i中引入了跳跃式扫描功能,即使在WHERE子句中没有指定employees.employee_id值,优化器也可能会选择使用该索引。相反,优化器可能会选择索引的快速全局扫描或全表扫描。

 

    如果在WHERE子句中使用索引的第三列,也会产生相同的情况:

select * from employees where employees.email='justin@yahoo.com'

 

     在该程序清单中,WHERE子句指定了索引中第三列的值。优化器可能选择执行索引快速扫描访问索引快速全局扫描全表扫描。通过创建索引,您可以在执行查询时为数据库提供更多的选择。从而有希望改进整体的性能。注意,用户的代码没有改变,优化器可以识别该索引,并且根据每种替代方法的预期成本决定使用何种方法

 

两种最常见的索引扫描类型唯一扫描范围扫描。在唯一扫描中,数据库知道索引包含一个唯一值列表。在范围扫描中,数据库将根据查询标准从索引中返回多个值。在该示例中,index_emp和index_emp3索引没有被创建为唯一索引。Oracle将在检索它们的值时执行范围扫描。在创建索引时,使用CREATE UNIQUE INDEX命令可以创建唯一索引

 

如何创建唯一索引(unique index):

1)用创建命令:CREATE UNIQUE INDEX

2)创建主键约束,Oracle将基于指定的列自动创建唯一索引(除非使用DISABLE子句创建约束)。

3)创建UNIQUE约束时,Oracle将基于指定的列自动创建唯一索引(除非使用DISABLE子句创建约束)

4)如果创建多列的主键,Oracle将创建组合索引,其中的列按照在创建主键时指定的顺序排列。
----------------------------------------------------------------------------------------------------------------------

 

 

  • 大小: 29.8 KB
  • 大小: 37.3 KB
分享到:
评论

相关推荐

    ORACLE9i_优化设计与系统调整

    §2.4.1.5 在运行控制实用程序中设置日志参数 50 §2.4.1.6 理解监听日志中信息 50 §2.4.1.7 理解连接管理器信息 53 §2.4.2 跟踪文件( Trace File ) 53 §2.4.2.1 跟踪文件的命名: 54 §2.4.2.2 参数设置与初始化...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton....

    Oracle9i的init.ora参数中文说明

    值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: 从 NLS_TERRITORY 中获得 nls_date_language: 说明: 指定拼写日期名, 月名和日期缩写词 (AM, PM, AD, BC) 的语言。...

    SQL21日自学通

    SQL 在编程中的应用 27 第二天查询— — SELECT 语句的使用 30 目标 30 背景 30 一般的语法规则 30 你的第一个查询 33 总结 37 问与答 38 校练场 38 练习 39 第三天表达式条件语句与运算 40 第四天函数对数据的...

    DELPHI技巧集(集合各种开发源码)

    66 Message.htm DELPHI中的消息处理机制 9K 67 More_page_find.htm Delphi中多库关联查询 3K 68 More_t.htm DELPHI下的多线程程序设计 7K 69 Oficebar.htm 用Delphi4实现风Word97格的工具栏 2K 70 Open_bar....

    asp.net知识库

    asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    (1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...

    Javashop开发规范V2.2

    在实合格bean和数据库对照过程中,数据库机制需要识别主键,所以需要我们在主键的对应属性的Geter方法中加上@PrimaryKeyFiled注解,如: private Integer brand_id @PrimaryKeyField public Integer getBrand_id() ...

    好用的代码生成源码

    配置classpath,将generator/lib中的rapid-generator.jar及其它数据库驱动加入classpath 修改generator.xml的数据库连接属性及其它属性 以application的方式运行GeneratorMain类,要生成不同的table,直接修改代码即可 ...

    mysql数据库my.cnf配置文件

    # MyISAM设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE或用CREATE INDEX创建索引或ALTER TABLE过程中排序 MyISAM索引分配的缓冲区 myisam_max_sort_file_size = 10G # 如果临时文件会变得超过索引,不要使用...

    21天学习SQL V1.0

    21天学习SQL V1.0.pdf 66 SQL 21 日自学通(V1.0) 翻译人笨猪 ...日期/时间函数............................................................................................................ADD_MONTHS..................

Global site tag (gtag.js) - Google Analytics