精华内容
下载资源
问答
  • Oracle数据库索引

    万次阅读 2013-06-14 16:54:22
    -- Oracle默认建立B-tree索引 create index 索引名 on 表名(列名) 复合索引:在两列或多列上建立的索引。在同一张表上可以有多个索引,但是这些索引所包含的列的组合必须不完全相同。如: create index

    1 索引基本概念

    索引是用于加速数据存取的数据对象,合理的使用索引可以大幅降低I/O次数,从而提高数据访问性能。

    单列索引:在一个列上建立的索引,比如:

    -- Oracle默认建立B-tree索引
    create index 索引名 on 表名(列名)

    复合索引:在两列或多列上建立的索引。在同一张表上可以有多个索引,但是这些索引所包含的列的组合必须不完全相同。如:

    create index emp_idx1 on emp(ename, job);
    create index emp_idx2 on emp(job, ename);
    索引的使用原则:在大表上建立索引才有意义;在where子句(where子句中一般将熵值较大的字段放在后面,SQL语句的查询条件是从右向左)或连接条件上经常使用的列上建立索引;索引的层次不宜超过4层。

    索引的缺点:建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引;更新数据时,必须同时对索引进行更新,以维持数据和索引的一致性。

    因此,不恰当的索引反而会降低系统性能,因为在数据插入、修改和删除时需要额外的时间更新索引。例如,如在如下字段建立索引一般是不恰当的:很少或从不引用的字段;逻辑型字段,如男或女(是或否)等。总之,建立索引提高查询效率是以消耗一定的系统资源(额外的存储和增删改操作额外的索引更新时间)为代价的,DBA需要慎重考虑在哪些字段上建立索引,以及建立哪种索引。

    2 索引的作用

    支持快速查询

    对于存储大量数据的数据库,线性查找效率很低,索引技术使数据库支持次线性时间查找以提高查询性能。索引是所有提高查询性能的数据结构。目前已经有许多数据结构可用于提高查询速度,事实上计算机科学领域的研究有很大一部分工作是对索引数据结构的研究和分析。索引数据结构的研究需要考虑查询性能、索引大小和索引更新性能等方面的折中。许多索引提供对数时间复杂度(O(logn(N)))的查找性能,某些情况下甚至可以获得O(1)时间复杂度。

    实现数据库约束

    索引也可以用于实现数据库的约束,如UNIQUE,EXCLUSION,PRIMARY KEY和FOREIGN KEY。UNIQUE索引约束其所引用的列,该列的值唯一。数据库系统通常会默认在PRIMARY KEY(主键)的列上创建索引。

    3 索引的架构

    在Sybase中,分为clustered indexes(聚集索引)和nonclustered indexes(非聚集索引)。聚集索引是一种特殊的索引,它把表中的记录的物理存储重新排序。因此,每张表只能有一个聚集索引。聚集索引的叶节点包含数据页。

    非聚集索引中,索引的逻辑顺序与物理存储顺序不同。非聚集索引的叶节点中不包含数据页,而是包含索引行。

    Oracle中并不存在这两种索引。仅从技术上讲,Oracle的IOT(index organized table)可以实现clustered indexes的作用,但是通常不推荐这么做。

    Oracle提供了称为cluster的结构,但与上述两种索引并无关系。cluster是一种将多个表存到同一个block中的方法。正常情况下,一个block包含1个表的数据。在一个cluster中,多个表的数据共享同一个block。

    4 Oracle索引的类型

    按照数据存储方式,分为B-树索引、反向索引、位图索引,B-树索引建立在重复值很少的列上,位图索引建立在重复值很多、不同值相对固定的列上。

    按照索引列的个数,分为单列索引、复合索引;

    按照索引列值的唯一性,分为唯一索引、非唯一索引。

    此外还有函数索引、全局索引、分区索引等。

    Oracle数据库提供以下类型的索引:

    • B-tree索引(Oracle默认建立B-tree索引)
    • B-tree聚集索引(B-tree cluster indexes)
    • Hash聚集索引(Hash cluster indexes)
    • 反向索引(Reverse key indexes)
    • 位图索引(Bitmap indexes)
    • 位图连接索引(Bitmap join indexes)

    Oracle也支持基于函数的索引和某个应用的域索引(domain indexes)。

    4.1 基于函数的索引

    基于函数的索引SQL语句如下:

    -- 基本结构
    CREATE [UNIQUE] INDEX index_name
      ON table_name (function1, function2, . function_n)
      [ COMPUTE STATISTICS ];
    
    -- 例子
    CREATE INDEX supplier_idx
      ON supplier (UPPER(supplier_name));
    COMPUTE STATISTICS表示是否收集索引的统计信息。

    4.2 位图索引

    目前大量使用的索引一般主要是B-Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的。而位图索引主要针对大量相同值的列而创建,例如:类别,操作员,部门ID等。位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。


    位图索引非常适合于数据仓库应用,因为数据仓库处理的是大量即席查询,几乎没有并发的事务。位图索引提供以下优势:

    • 缩短了即席查询的相应时间
    • 比其他索引技术节省存储空间
    • 高性能
    • 高效的并行DML和加载

    位图索引不适合OLTP应用,OLTP应用需要处理大量并发的修改数据的事务。位图索引更适合于基于数据仓库的决策支持系统,因为决策支持系统主要是查询数据而不是修改数据。位图索引页不适合于主要用于大于或小于比较的列,只适合于等式查询,特别是AND,OR和NOT操作;大于和小于比较更适合采用B-tree索引。

    CREATE BITMAP INDEX 索引名 ON 表名 (列名);

    5 Oracle索引的实现

    Oracle数据库使用B-tree结构组织索引以加速数据访问。如果没有索引,就只能顺序扫描整个数据库。对于n行的表,平均扫描行数是n/2。

    如果将这些记录根据它们的某一列组织成B-tree结构,一个叶节点代表一条数据,那么从n行的表中查询一条记录的平均用时为log(n)。这就是Oracle数据库索引的基本原理。


    B-tree的分支节点包含到其子节点的索引。最低层节点(叶节点)包含了索引数据值和其对应的rowid,rowid用于定位对应的数据表行。

    参考:

    Overview of Indexes. http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#i5671

    CREATE INDEX. http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_5011.htm#SQLRF01209

    http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#CNCPT811

    About Indexes. http://docs.oracle.com/cd/B28359_01/server.111/b28310/indexes001.htm

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:586423377841

    展开全文
  • Oracle数据库索引及plsql索引添加

    千次阅读 2018-04-07 13:31:47
    做压力测试的时候,领导叫我根据项目里的sql语句在数据库内添加索引,了解了下数据库索引的概念及在plsql中的索引添加方法。索引是对表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息...

    做压力测试的时候,领导叫我根据项目里的sql语句在数据库内添加索引,了解了下数据库索引的概念及在plsql中的索引添加方法。

    索引是对表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

    索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

    简单来说,就是根据sql语句,对where后的条件,在数据库中加上索引,那么每次搜索的时候会先去索引里面找条件,节省搜索的时间。比如select * from user where name='tom' and age='16' ,那么可以给这一句加上name和age的索引,需要注意的是索引里两个字段的顺序也需要根据where语句后的顺序来。

    那么在plsql图形化界面中添加索引的方法是,选中相应的表右键编辑,上方导航中会有索引选项,点进去后主键是默认为索引的,继续添加你需要的索引即可。


    展开全文
  • 关于oracle数据库索引

    2014-01-14 03:15:11
    执行sql如下: select * from lm3.cc03 ...lm3.cc03表中有aae017和aae036 的组合索引,也有aae036 的单独索引。 但是执行以上sql时,lm3.cc03检索用不上索引,为什么? 哪位大侠给指导一下,谢谢!
  • Oracle数据库索引的创建

    千次阅读 2018-09-12 19:00:18
    数据库建立的时候 如果表数据和索引数据不需要分开  建表时直接指定主键索引  CREATE TABLE VOAMASTM (   "REFCODE" NUMBER(10) DEFAULT 0 NOT NULL ,   "OWNERREFCODE" NUMBER(10) ...

    数据库建立的时候

    如果表数据和索引数据不需要分开
        建表时直接指定主键索引
        CREATE TABLE VOAMASTM  ( 
          "REFCODE"  NUMBER(10) DEFAULT 0 NOT NULL , 
          "OWNERREFCODE"  NUMBER(10) DEFAULT 0  , 
          "CREATEDATE"  DATE DEFAULT TO_DATE('1901-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  , 
          "EDTID"  NVARCHAR2(3)   , 
          "LASTMODUSER"  NVARCHAR2(20)   , 
          "AGENTUSER"  NVARCHAR2(20)   , 
          "LASTMODDATE"  DATE DEFAULT TO_DATE('1901-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  , 
          CONSTRAINT  "PK_VOAMASTM" PRIMARY KEY ( "REFCODE" ) 
        );
        或着
        CREATE TABLE VOAMASTM  ( 
          "REFCODE"  NUMBER(10) DEFAULT 0 NOT NULL , 
          "OWNERREFCODE"  NUMBER(10) DEFAULT 0  , 
          "CREATEDATE"  DATE DEFAULT TO_DATE('1901-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  , 
          "EDTID"  NVARCHAR2(3)   , 
          "LASTMODUSER"  NVARCHAR2(20)   , 
          "AGENTUSER"  NVARCHAR2(20)   , 
          "LASTMODDATE"  DATE DEFAULT TO_DATE('1901-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  , 
          CONSTRAINT  "PK_VOAMASTM" PRIMARY KEY ( "REFCODE" ) using index tablespace users
        );

        如果表数据和索引需要分开的话就先建表,然后建立索引
        CREATE TABLE VOAMASTM  ( 
          "REFCODE"  NUMBER(10) DEFAULT 0 NOT NULL , 
          "OWNERREFCODE"  NUMBER(10) DEFAULT 0  , 
          "CREATEDATE"  DATE DEFAULT TO_DATE('1901-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  , 
          "EDTID"  NVARCHAR2(3)   , 
          "LASTMODUSER"  NVARCHAR2(20)   , 
          "AGENTUSER"  NVARCHAR2(20)   , 
          "LASTMODDATE"  DATE DEFAULT TO_DATE('1901-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  
        );
        alter table VOAMASTM add constraint PK_VOAMASTM primary key(REFCODE) using index tablespace users;

     

    表与索引分开优点

    Oracle数据库的逻辑结构和物理结构

      Oracle 数据库的逻辑结构是由一些数据库对象组成,如数据库表空间、表、索引、段、视图、存储过程、触发器等。数据库的逻辑存储结构(表空间等)决定了数据库的物理空间是如何被使用的,数据库对象如表、索引等分布在各个表空间中。

      Oracle 数据库的物理结构从操作系统一级查看,是由一个个的文件组成,从物理上可划分为:数据文件、日志文件、控制文件和参数文件。数据文件中存放了所有的数据信息;日志文件存放数据库运行期间产生的日志信息,它被重复覆盖使用,若不采用归档方式的话,已被覆盖的日志信息将无法恢复;控制文件记录了整个数据库的关键结构信息,它若被破坏,整个数据库将无法工作和恢复;参数文件中设置了很多Oracle 数据库的配置参数,当数据库启动时,会读取这些信息。

      逻辑结构的优化

      逻辑结构优化用通俗的话来说就是通过增加、减少或调整逻辑结构来提高应用的效率,下面通过对基本表的设计及索引、聚簇的讨论来分析ORACLE逻辑结构的优化。

      1、基本表扩展

      数据库性能包括存储空间需求量的大小和查询响应时间的长短两个方面。为了优化数据库性能,需要对数据库中的表进行规范化。一般来说,逻辑数据库设计满足第三范式的表结构容易维护且基本满足实际应用的要求。所以,实际应用中一般都按照第三范式的标准进行规范化,从而保证了数据库的一致性和完整性,设计人员往往会设计过多的表间关联,以尽可能地降低数据冗余。但在实际应用中这种做法有时不利于系统运行性能的优化:如过程从多表获取数据时引发大量的连接操作,在需要部分数据时要扫描整个表等,这都消耗了磁盘的I/O 和CPU 时间。

      为解决这一问题,在设计表时应同时考虑对某些表进行反规范化,方法有以下几种:一是分割表。分割表可分为水平分割表和垂直分割表两种:水平分割是按照行将一个表分割为多个表,这可以提高每个表的查询速度,但查询、更新时要选择不同的表,统计时要汇总多个表,因此应用程序会更复杂。垂直分割是对于一个列很多的表,若某些列的访问频率远远高于其它列,就可以将主键和这些列作为一个表,将主键和其它列作为另外一个表。通过减少列的宽度,增加了每个数据页的行数,一次I/O就可以扫描更多的行,从而提高了访问每一个表的速度。但是由于造成了多表连接,所以应该在同时查询或更新不同分割表中的列的情况比较少的情况下使用。二是保留冗余列。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的列,以避免表之间的连接过于频繁,一般在冗余列的数据不经常变动的情况下使用。三是增加派生列。派生列是由表中的其它多个列的计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。

      因此,在数据库的设计中,数据应当按两种类别进行组织:频繁访问的数据和频繁修改的数据。对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化。对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。有时还需将规范化的表作为逻辑数据库设计的基础,然后再根据整个应用系统的需要,物理地非规范化数据。规范与反规范都是建立在实际的操作基础之上的约束,脱离了实际两者都没有意义。只有把两者合理地结合在一起,才能相互补充,发挥各自的优点。

      2、索引和聚簇

      创建索引是提高检索效率最有效的方法之一,索引把表中的逻辑值映射到安全的RowID,能快速定位数据的物理地址,可以大大加快数据库的查询速度,一个建有合理索引的数据库应用系统可能比一个没有建立索引的数据库应用系统效率高几十倍,但并不是索引越多越好,在那些经常需要修改的数据列上建立索引,将导致索引B*树的不断重组,造成系统性能的下降和存储空间的浪费。对于一个大型表建立的索引,有时并不能改善数据查询速度,反而会影响整个数据库的性能。这主要是和SGA的数据管理方式有关,Oracle在进行数据块高速缓存管理时,索引数据比普通数据具有更高的驻留权限,在进行空间竞争时,Oracle会先移出普通数据,对建有索引的大型表进行数据查询时,索引数据可能会用完所有的数据块缓存空间,Oracle不得不频繁地进行磁盘读写来获取数据,所以,在对一个大型表进行分区之后,可以根据相应的分区建立分区索引。

      Oracle提供了另一种方法来提高查询速度,就是聚簇(Cluster)。所谓聚簇,简单地说就是把几个表放在一起,按一定公共属性混合存放。聚簇根据共同码值将多个表的数据存储在同一个Oracle块中,这时检索一组Oracle块就同时得到两个表的数据,这样就可以减少需要存储的Oracle块,从而提高应用程序的性能。

      对于逻辑结构的优化,还应将表数据和索引数据分开表空间存储,分别使用独立的表空间。因为如果将表数据和索引数据放在一起,表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争,降低系统的响应效率。将表数据和索引数据存放在不同的表空间中,并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上,就可以避免这种竞争了。

      物理结构的优化

      数据库的数据最终是存储在物理磁盘上的,对数据进行访问就是对这些物理磁盘进行读写,因此对于这些物理存储的优化是系统优化的一个重要部分。对于物理存储结构优化,主要是合理地分配逻辑结构的物理存储地址,这样虽不能减少对物理存储的读写次数,但却可以使这些读写尽量并行,减少磁盘读写竞争,从而提高效率,也可以通过对物理存储进行精密的计算减少不必要的物理存储结构扩充,从而提高系统利用率。

     1、磁盘读写并行优化

      对于数据库的物理读写,Oracle系统本身会进行尽可能的并行优化,例如在一个最简单的表检索操作中,如果表结构和检索域上的索引不在一个物理结构上,那么在检索的过程中,对索引的检索和对表的检索就是并行进行的。

      2、操作并行优化

      操作并行的优化是基于操作语句的统计结果,首先是统计各个表的访问频率,表之间的连接频率,根据这些数据按如下原则分配表空间和物理磁盘,减少系统进程和用户进程的磁盘I/O竞争;把需要连接的表格在表空间/物理磁盘上分开;把高频访问的表格在表空间/物理磁盘上分开;把经常需要进行检索的表格的表结构和索引在表空间/物理磁盘上分开。

      3、减少存储结构扩展

      如果应用系统的数据库比较脆弱,并在不断地增长或缩小,这样的系统在非动态变化周期内效率合理,但是当在动态变化周期内的时候,性能却很差,这是由于Oracle的动态扩展造成的。在动态扩张的过程中,Oracle必须根据存储的要求,在创建行、行变化获取缺省值时,扩展和分配新的存储空间,而且表格的扩展往往并不是事情的终结,还可能导致数据文件、表空间的增长,这些扩展会导致在线系统反应缓慢。对于这样的系统,最好的办法就是在建立的时候预先分配足够的大小和合适的增长幅度。在一个对象建立的时候要根据应用充分地计算他们的大小,然后再根据这些数据来定义对象Initial、Next和Minextents的值,使数据库在物理存储上和动态增长次数上达到一个比较好的平衡点,使这些对象既不经常发生增长,也不过多地占用数据库。

      结论

      优化Oracle 数据库对提高计算机系统的可用性和效率,具有非常重要的意义, 特别是在Oracle数据库设计开发阶段,对逻辑结构和物理结构进行有效的优化设计,创建一个规划布局合理的数据库,可以获得最小的系统开销,能从根本上大大提高应用系统的整体性能,对于以后的数据库性能调整和利用都有很大的益处。

    展开全文
  • Oracle数据库索引底层实现原理笔记

    千次阅读 2020-08-19 16:49:20
    当然, 有的数据库也使用哈希桶作用索引的数据结构 , 然而, 主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。 我们平时建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,...
    • 为什么要给表加上主键?

    • 为什么加索引后会使查询变快?

    • 为什么加索引后会使写入、修改、删除变慢?

    • 什么情况下要同时在两个字段上建索引?
      想要理解索引原理必须清楚一种数据结构「平衡树」(非二叉),也就是b tree或者 b+ tree,重要的事情说三遍:“平衡树,平衡树,平衡树”。当然, 有的数据库也使用哈希桶作用索引的数据结构 , 然而, 主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。

    我们平时建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行。 事实上, 一个加了主键的表,并不能被称之为「表」。一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐, 跟我认知中的「表」很接近。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错, 再说一遍, 整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。

    在这里插入图片描述

    上图就是带有主键的表(聚集索引)的结构图。图画的不是很好, 将就着看。其中树的所有结点(底部除外)的数据都是由主键字段中的数据构成,也就是通常我们指定主键的id字段。最下面部分是真正表中的数据。 假如我们执行一个SQL语句:

    select * from table where id = 1256;

    首先根据索引定位到1256这个值所在的叶结点,然后再通过叶结点取到id等于1256的数据行。 这里不讲解平衡树的运行细节, 但是从上图能看出,树一共有三层, 从根节点至叶节点只需要经过三次查找就能得到结果。如下图

    在这里插入图片描述

    假如一张表有一亿条数据 ,需要查找其中某一条数据,按照常规逻辑, 一条一条的去匹配的话, 最坏的情况下需要匹配一亿次才能得到结果,用大O标记法就是O(n)最坏时间复杂度,这是无法接受的,而且这一亿条数据显然不能一次性读入内存供程序使用, 因此, 这一亿次匹配在不经缓存优化的情况下就是一亿次IO开销,以现在磁盘的IO能力和CPU的运算能力, 有可能需要几个月才能得出结果 。如果把这张表转换成平衡树结构(一棵非常茂盛和节点非常多的树),假设这棵树有10层,那么只需要10次IO开销就能查找到所需要的数据, 速度以指数级别提升,用大O标记法就是O(log n),n是记录总树,底数是树的分叉数,结果就是树的层次数。换言之,查找次数是以树的分叉数为底,记录总数的对数,用公式来表示就是

    在这里插入图片描述

    用程序来表示就是Math.Log(100000000,10),100000000是记录数,10是树的分叉数(真实环境下分叉数远不止10), 结果就是查找次数,这里的结果从亿降到了个位数。因此,利用索引会使数据库查询有惊人的性能提升。

    然而, 事物都是有两面的, 索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,原因很简单的, 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。

    讲完聚集索引 , 接下来聊一下非聚集索引, 也就是我们平时经常提起和使用的常规索引。

    非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。 如下图

    在这里插入图片描述

    每次给字段建一个新索引, 字段中的数据就会被复制一份出来, 用于生成索引。 因此, 给表添加索引,会增加表的体积, 占用磁盘存储空间。

    非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据,如下图

    在这里插入图片描述

    不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。

    然而, 有一种例外可以不使用聚集索引就能查询出所需要的数据, 这种非主流的方法 称之为「覆盖索引」查询, 也就是平时所说的复合索引或者多字段索引查询。 文章上面的内容已经指出, 当为字段建立索引以后, 字段中的内容会被同步到索引之中, 如果为一个索引指定两个字段, 那么这个两个字段的内容都会被同步至索引之中。

    先看下面这个SQL语句

    //建立索引

    create index index_birthday on user_info(birthday);

    //查询生日在1991年11月1日出生用户的用户名

    select user_name from user_info where birthday = ‘1991-11-1’

    这句SQL语句的执行过程如下

    首先,通过非聚集索引index_birthday查找birthday等于1991-11-1的所有记录的主键ID值

    然后,通过得到的主键ID值执行聚集索引查找,找到主键ID值对就的真实数据(数据行)存储的位置

    最后, 从得到的真实数据中取得user_name字段的值返回, 也就是取得最终的结果

    我们把birthday字段上的索引改成双字段的覆盖索引

    create index index_birthday_and_user_name on user_info(birthday, user_name);

    这句SQL语句的执行过程就会变为

    通过非聚集索引index_birthday_and_user_name查找birthday等于1991-11-1的叶节点的内容,然而, 叶节点中除了有user_name表主键ID的值以外, user_name字段的值也在里面, 因此不需要通过主键ID值的查找数据行的真实所在, 直接取得叶节点中user_name的值返回即可。 通过这种覆盖索引直接查找的方式, 可以省略不使用覆盖索引查找的后面两个步骤, 大大的提高了查询性能,如下图

    在这里插入图片描述

    数据库索引的大致工作原理就是像文中所述, 然而细节方面可能会略有偏差,这但并不会对概念阐述的结果产生影响 。

    展开全文
  • SQL Server和Oracle数据库索引介绍

    千次阅读 2016-05-25 16:27:38
    SQL Server和Oracle数据库索引介绍 1 SQL Server中的索引   索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中...
  • ORACLE数据库索引失效

    千次阅读 2011-04-15 00:07:00
    数据库中有一个表,用PL/SQL查看该表的索引没有被DROP掉,  但是表上的数据查询起来很慢(查询时间大概是原来的3倍),后来重建了一下索引就好了,  请问这是为什么,  在什么情况下会出现类似的索引丢失的...
  • 浅谈oracle数据库索引

    千次阅读 2015-03-11 20:39:28
    [什么是索引] 在关系型数据库中,索引是一种和表有关的数据结构,它可以使查询的sql...数据库索引也是一样,只有先插入好数据,再建立索引。 [如何创建索引] 创建表: create table person (id int, sex char(1), na
  • oracle数据库索引种类,分别什么情况下使用 关于索引有些地方我不太明白1.oracle常用的都有哪几种索引,比如唯一索引之类的,sql语句都是怎么写?2.都在什么情况下适合用?3.最正常的语句create index name on..........
  • 如何合理创建Oracle数据库索引的3个要求:  在Oracle数据库中,创建索引虽然比较简单。但是要合理的创建索引则比较困难了。笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的...
  • Oracle 数据库修改索引表空间
  • Oracle数据库中,创建索引虽然比较简单。但是要合理的创建索引则比较困难了。笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。虽然这可以通过一句话来概括优化的索引的基本...
  • 参考链接 http://blog.itpub.net/14401924/viewspace-659821/
  • ORACLE数据库索引类型及其适用场景
  • 一旦建立了索引,在用户表中建立、更改和删除数据库时, Oracle就自动地维护索引。创建索引时,下列准则将帮助用户做出决定:  1) 索引应该在SQL语句的"where"或"and"部分涉及的表列(也称谓词...
  • 数据库索引: 索引有单列索引 复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。 建设原则:  1、索引应该经常建在...
  • oracle数据库在实时监控sql性能时怎么筛选那些没有索引的,性能差的sql语句,需要实时的,最好能自主选择一段时间的
  • Oracle数据库添加索引注意事项

    千次阅读 2018-02-05 10:39:40
    1.确定是否有专门的索引空间。 --查看表所在的表空间 SELECT * FROM user_tables t WHERE t.table_name='TABLENAME'; --查看索引所在的索引空间 SELECT TABLESPACE_NAME FROM DBA_INDEXES WHERE INDEX_NAME='...
  • Oracle数据库

    万人学习 2016-12-31 09:04:38
    本课程主要讲解如下内容:Oracle体系结构、Oracle 基础管理、SQL 语言、Sequence和...在本课程讲解之中会提供有相应的练习习题以及综合案例分析,帮助读者迅速掌握Oracle数据库的核心开发技能。官方QQ群:612148723。
  • 一般来说ORACLE索引由系统自动启用的,也可以强制使用,方法如下: /*假如表为Grade_xu 列名为(学号) 索引名为index1*/ --创建索引 create index index1 on Grade_xu(学号); --查询Grade_xu中索引是否创建,...
  • 各种Oracle索引类型介绍 逻辑上: Single column 单行索引 Concatenated 多行索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函数索引 Domain 域索引 物理上: Partitioned 分区索引 NonPartitioned ...
  • oracle数据库建立索引的原则

    千次阅读 2016-08-08 23:16:02
    数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作。 2,尝试建立索引来帮助特定的查询。检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。 3,尝试建立复合索引来...
  • oracle数据库删除索引的正确方式

    千次阅读 2020-06-30 15:52:59
    有时候发现你之前创建的索引后来你用不上了,于是为了节省空间,降低优化器在选择执行计划时候的成本。我们会选择删除这个索引。 但是因为业务场景比较多,又不是所有代码都是一个人写的。所以直接drop索引可能导致...
  • Oracle数据库之视图与索引

    千次阅读 2015-06-22 23:44:25
    Oracle数据库之视图与索引1. 视图简介视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,视图是存储在数据字典里的一条SELECT语句。通过...
  • Oracle 数据库对象-索引

    千次阅读 2014-05-31 09:44:27
    数据库索引(Index)的概念与目录的概念非常类似。如果某列出现在查询的条件中, 而该列的数据是无序的,查询时只能从第一行开始一行一行的匹配。创建索引就是对某些特 定列中的数据排序,生成独立的索引表。在...
  • Oracle数据库的优化--索引

    千次阅读 2017-11-28 16:21:53
    求教得到优化的方式,可以加快数据库的查询速度—数据库的索引什么是数据库索引索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,...
  • 掌握Oracle索引、视图及序列的基本使用方法。 【实验内容】 1.用hr用户连接数据库后,为EMPLOYEES表的DEPARTMENT_ID列添加索引。 连接后查询索引可知employees表的department_id已有索引 emp_department_id,故...
  • 1、查看表中有哪些索引 select * from user_indexes where table_name = '表名' 或者 select * from all_indexes where table_name = '表名' 2、查看表中索引对应哪些列 select * from user_ind_columns where ...
  • Oracle数据库索引的维护

    千次阅读 2004-08-30 10:08:00
    查看系统表中的用户索引Oracle中,SYSTEM表是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程、包、函数和触发器的定义以及系统回滚段。一般来说,应该尽量避免在SYSTEM表中存储非SYSTEM用户的...
  • 为什么有时ORACLE数据库不用索引来查找数据? (作者:福州电信局计算机中心 李炯 2000年05月15日 18:17)  当你运用SQL语言,向数据库发布一条查询语句时,ORACLE将伴随产生一个“执行计划”,也就是该语句将...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 176,229
精华内容 70,491
关键字:

oracle数据库索引分类