`
danielhjd
  • 浏览: 246327 次
  • 性别: 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
分享到:
评论

相关推荐

    Oracle中SQL语句执行效率的查找与解决

    在Oracle中,常见的执行计划类型包括全表扫描(Full Table Scans)、索引唯一扫描(Index Unique Scans)、范围扫描(Index Range Scans)、跳跃扫描(Index Skip Scans)和位图连接(Bitmap Joins)等。每种类型的...

    Oracle Exception汇总(自定义Oracle异常)

    Oracle数据库在处理错误和异常时有一套完整的机制,这些异常主要分为预定义异常和自定义异常。预定义异常是Oracle系统已经内置的一些常见错误,它们都有对应的错误代码(ORA-xxx)。下面,我们将深入探讨一些常见的...

    Oracle数据库使用指南

    在讨论Oracle数据库之前,我们需要了解一些基本的数据库术语,如数据库(Database)、表(Table)、记录(Record)、字段(Field)、主键(Primary Key)、索引(Index)等。数据库是存储数据的结构化集合,表是...

    涂抹Oracle 高清版

    首先,"涂抹Oracle"这个标题可能寓意着作者以一种新颖、直观的方式解析Oracle的复杂性,如同在Oracle的复杂表象上涂抹清晰的色彩,使读者能看透其内在机制。这种比喻性的手法在教学中常见,能够激发读者的兴趣,使...

    为什么oracle有时不用索引来查找数据

    4. **连接顺序**:例如,在表`emp`的`deptno`列上有索引,而表`dept`的`deptno`列没有索引的情况下,如果`WHERE`子句包含`emp.deptno = dept.deptno`,并且`emp`作为外表被首先访问,那么由于连接机制的原因,`emp....

    ArcSDE连接Oracle配置

    - 在Oracle数据库中,不同的表空间可以被分配给特定类型的数据,例如FEATURE、ATTRIBUTE、SPATIAL_INDEX、ORACLE_INDEX等。 - 每个表空间都有其独特的用途,例如,FEATURE表空间用于存储特征数据;ATTRIBUTE表空间...

    理解ORACLE数据库锁机制高效维护医院信息系统运行.pdf

    Oracle数据库锁机制是确保数据库并发访问安全的重要工具,尤其在医院信息系统这种高并发、数据敏感的环境中,理解并有效管理锁机制对于系统的高效运行至关重要。本文主要探讨Oracle数据库中的TM锁和TX锁机制,以及...

    关于Oracle 9i中监视索引的使用介绍

    Oracle 9i 提供了一种新的机制来帮助数据库管理员(DBA)有效地管理和监控数据库中的索引,特别是识别那些未被使用的索引。索引在数据库系统中起着至关重要的作用,因为它们能显著提高查询性能,尤其是在处理大量ad-...

    Oracle DB优化总结

    【Oracle DB优化总结】 在数据库管理系统中,Oracle Database(Oracle DB)因其稳定性和高性能而备受赞誉,但...通过深入理解Oracle的特性和机制,我们可以更有效地提升数据库的运行效率,保障系统的稳定性和高性能。

    logstash5.6.1向es导入oracle数据库数据

    index => "oracle_data-%{+YYYY.MM.dd}" document_type => "oracle_table" } } ``` 4. **JDBC驱动**:确保Logstash运行环境已包含Oracle的JDBC驱动(通常为ojdbc.jar),这允许Logstash与Oracle数据库建立连接...

    DB2与ORACLE常用语句对照

    - Oracle和DB2都有自己的锁机制,但具体的锁类型和级别管理策略略有差异。 8. 游标: - 游标在Oracle和DB2中用于处理结果集,但使用和管理方式有所不同。 9. 复制和数据迁移: - Oracle的GoldenGate和DB2的...

    Oracle hint的用法

    1. **理解Hint的作用机制**:在实际应用中,理解每种Hint的工作原理及其适用场景至关重要。正确使用Hint可以帮助优化SQL查询性能。 2. **测试与验证**:在生产环境中使用Hint前,应先在测试环境中充分验证其效果,...

    Oracle考试必备知识

    2. **Oracle进程**:Oracle在运行时会创建多个后台进程,每个进程都有特定的功能,例如控制进程、数据写入进程等。 #### 三、Oracle表空间管理 1. **创建表空间**:用于存储数据库对象,如表、索引等。 ```sql ...

    oracle函数大全及存储过程语法.rar

    在Oracle中,函数和存储过程是数据库管理、数据处理和业务逻辑实现的重要组成部分。本资源"oracle函数大全及存储过程语法.rar"显然是一个关于Oracle函数和存储过程的详细指南,涵盖了各种常用和高级的函数以及存储...

    oracle 11g sql language reference

    在Oracle 11g中,可以通过CREATE INDEX命令来创建各种类型的索引,如B-tree、位图索引等。 8. 存储过程和函数:存储过程和函数是存储在数据库中的预编译代码块,可以用来执行复杂的操作和计算。在Oracle 11g中,...

    Oracle高级详细资料

    首先,Oracle物理内存的分配是数据库高效运行的基础。在Oracle 9i版本中,内存结构主要由SGA(System Global Area)组成,包括数据缓冲区、重做日志缓冲区、共享SQL区、PGA(Program Global Area)等组件。理解如何...

    Oracle经典面试总结-去重-附答案.pdf

    Oracle经典面试总结 本文档总结了 Oracle 数据库相关的面试问题和答案,涵盖了 optimizer_...ASSM(Automatic Segment Space Management)是 Oracle 数据库中的一种表空间管理机制,能够自动管理表空间的存储空间。

    Oracle数据库入门教材(PDF)

    在学习Oracle之前,我们需要了解一些数据库基础概念,如表(Table)、字段(Column)、记录(Row)、索引(Index)、视图(View)和存储过程(Stored Procedure)。此外,还要理解SQL(Structured Query Language)...

    Oracle B*树索引内部机制及其应用的研究.pdf

    Oracle B*树索引是数据库管理系统中用于快速查找数据的一种数据结构,尤其在Oracle数据库中扮演着...因此,深入理解Oracle索引的内部机制,结合具体业务场景,灵活运用各种索引策略,是确保数据库系统高效运行的关键。

Global site tag (gtag.js) - Google Analytics