第6章 oracle 索引与聚簇
- 格式:pps
- 大小:444.50 KB
- 文档页数:26
oracle索引的结构Oracle索引的结构:了解索引对数据库性能的重要性引言:在数据库中,索引是一种数据结构,它可以加快数据的检索速度,提高数据库的性能。
Oracle作为一种关系型数据库管理系统,也使用索引来优化查询操作。
本文将详细介绍Oracle索引的结构以及其对数据库性能的影响。
一、什么是索引索引是一种数据结构,它类似于书籍的目录,可以帮助我们快速找到需要的数据。
在Oracle中,索引由一个或多个列组成,可以根据这些列的值快速定位到对应的行。
二、Oracle索引的结构1. B树索引B树索引是Oracle中最常见的索引类型。
它使用B树数据结构来组织索引数据,具有平衡性和高效性。
B树索引将索引数据存储在叶子节点中,并使用非叶子节点来加速查找过程。
B树索引适用于范围查询和精确查询。
2. B+树索引B+树索引是B树索引的一种变体,也是Oracle中常用的索引类型。
与B树索引不同,B+树索引将所有索引数据存储在叶子节点中,并使用非叶子节点来组织叶子节点之间的关系。
B+树索引适用于范围查询和排序操作。
3. 唯一索引唯一索引是一种特殊的索引类型,它要求索引列的值唯一,即不允许重复值。
唯一索引可以提高数据的完整性,并且可以通过快速查找来避免重复插入。
在Oracle中,唯一索引可以是B树索引或B+树索引。
4. 聚簇索引聚簇索引是一种特殊的索引类型,它将数据存储在物理上相邻的区域。
在Oracle中,表只能有一个聚簇索引,它可以加速范围查询和连接操作。
聚簇索引通常与主键约束一起使用。
三、索引对数据库性能的影响1. 提高查询速度索引可以加快查询操作的速度,尤其是在大型数据库中。
通过使用索引,数据库可以更快地定位到需要的数据,而不必扫描整个表。
2. 降低IO成本索引可以减少磁盘IO操作,提高数据库的IO性能。
当查询条件与索引列匹配时,数据库可以直接读取索引节点,而不必读取整个数据块。
3. 影响更新性能虽然索引可以提高查询性能,但对于更新操作,索引可能会带来额外的开销。
Oracle 索引簇索引簇是指使用索引定义簇键列数据的方法。
如果用户需要执行连接查询显示主从表的数据,则应该将主从表组织到索引簇。
1.普通表与索引簇在建立普通表时,Oracle 会为该表分配相应的表段。
例如,当建立表DEPT 和EMP 时,Oracle 会分别为这两张表分配表段DEPT 和EMP ,并且它们的数据被分别存放到这两个表段中。
如图10-7所示,表EMP 中的所有数据被存放到表段EMP 中,而表DEPT 中的数据则被存放到表段DEPT 中。
因为这两个表被存放在不同位置,所以在执行连接查询语句时,至少需要扫描两数据块才能检索到关联的数据。
empnoenamejob7954736974997521ATG SMITH ALLEN WARDCLERK CLERKSALESMAN SALESMANdeptnodnameloc10203040ACCOUNTING RESEARCH SALESOPERATIONSNEW YORK DALLAS CHICAGO BOSTONDEPT deptno10203030EMP图10-7 普通表存放数据的方式使用索引簇存储表数据时,Oracle 会将不同表的相关数据按照簇键值的存放在簇段中。
例如,当建立索引簇EMP_DEPT 时,并将EMP 和DEPT 表组织到索引簇后,Oracle 会按照簇键DEPTNO 存放相关数据,如图10-8所示。
簇键(deptno)107954778278397934ATG CLARK KING MILLER ACCOUNTINGdname NEW YORKloc20RESEARCH DALLAS73697566778878767902SMITH JONES SCOTT ADAMS FORDDEPT_EMP图10-8 索引簇存储数据表EMP 和DEPT 中的所有数据被存储在簇段DEPT_EMP 中。
因为关联数据被存储到同一个数据块,所以当执行如下的连接查询语句检索部门为10及该部门的雇员信息时,只需要扫描一个数据块就可以检索到关联数据。
oracle查索引字段在数据库中,索引是一种用于提高查询速度的数据结构。
可以把它看作是一个目录,通过它可以快速定位到所需数据的位置。
索引以特定的字段为关键字,对字段值进行排序和存储,从而提供了快速的数据访问路径。
索引的作用索引的作用在于加快查询的速度。
数据库中的数据通常存储在磁盘上,而磁盘的读写速度相比于内存来说会慢得多。
而索引则可以帮助数据库系统快速地定位到所需的数据,减少了磁盘I/O的次数和时间,加快了查询的速度。
索引的类型在Oracle数据库中,有多种类型的索引可以使用,每种类型的索引都有自己的特点和适用场景。
1. B树索引:B树索引是最常见的一种索引类型,它适用于等值查询和范围查询。
B树索引按照键值对进行排序,并且支持快速的查询操作。
它的结构类似于一个平衡二叉树,每个节点可以存储多个键值对。
2. B+树索引:B+树索引是一种改进版的B树索引,它的叶子节点是按照键值对进行排序的,并且叶子节点之间用指针连接起来,形成一个有序链表。
B+树索引适用于范围查询和排序操作,它的查询性能更好。
3. 唯一索引:唯一索引是一种保证字段值的唯一性的索引。
它可以加速唯一性约束的校验,并且可以提高数据的查询效率。
4. 聚簇索引:聚簇索引是一种特殊的索引类型,它改变了数据在磁盘上的存储方式,将相邻的行存储在一起。
聚簇索引适用于频繁进行范围查询的表,可以大幅提高查询性能。
如何创建索引在Oracle中,可以使用CREATE INDEX语句来创建索引。
该语句的语法如下:CREATE INDEX index_nameON table_name (column1, column2, ...);其中,index_name是索引的名称,table_name是索引所属的表名,column1, column2, ...是需要创建索引的字段名。
应该注意的是,在创建索引之前,需要对表进行分析,以确定哪些字段适合创建索引。
通常情况下,我们会选择经常用于查询条件的字段创建索引,以提高查询的效率。
oracle 查索引的聚簇因子语句【原创版】目录1.Oracle 数据库简介2.索引和聚簇因子的概念3.Oracle 中查询索引的聚簇因子的方法4.实际操作示例正文【1.Oracle 数据库简介】Oracle 数据库是当前业界最流行的关系数据库管理系统之一,它以其高性能、安全性和可扩展性而闻名。
Oracle 数据库支持多种数据类型和复杂数学运算,适用于各种行业和领域。
在 Oracle 数据库中,为了提高查询效率,通常会对数据表建立索引。
【2.索引和聚簇因子的概念】索引是一种数据库对象,它可以帮助数据库快速定位到所需的数据行。
通过建立索引,可以大大减少查询数据的时间。
在 Oracle 数据库中,索引分为 B 树索引、位图索引等类型。
聚簇因子是指在 Oracle 数据库中,一个表的数据行在物理存储上是按照什么顺序进行存储的。
聚簇因子通常是一个或多个列,它可以影响表的查询性能。
了解聚簇因子对于优化查询语句具有重要意义。
【3.Oracle 中查询索引的聚簇因子的方法】在 Oracle 数据库中,可以使用如下 SQL 语句查询某个索引的聚簇因子:```sqlSELECT INDEX_NAME, COLUMN_NAME, ORDERINGFROM INDEXESWHERE INDEX_NAME = "索引名称";```其中,`索引名称`需要替换为实际要查询的索引名称。
查询结果会返回索引名、聚簇因子列名以及聚簇顺序(ASC 表示升序,DESC 表示降序)。
【4.实际操作示例】假设有一个名为`employees`的表,其中有一个名为`id`的列,现在要查询`id`列的聚簇因子。
可以使用如下 SQL 语句:```sqlSELECT INDEX_NAME, COLUMN_NAME, ORDERINGFROM INDEXESWHERE INDEX_NAME = "IDX_employees_id";```查询结果如下:```INDEX_NAME | COLUMN_NAME | ORDERING------------ | ----------- | ----------IDX_employees_id | id | ASC```从结果中可以看出,`id`列的聚簇因子是按照升序(ASC)顺序存储的。
1表的类型1)堆组织表(heap organized tables).当增加数据时,将使用在段中找到的第一个适合数据大小的空闲空间.当数据从表中删除时,留下的空间允许随后的insert和update 重用.2)索引组织表.这里表存储在索引结构中,利用行本身物理排序.在堆中,数据可能被填到任何适合的地方,在索引组织表中,根据主关键字,以排序顺序来存储数据.3)聚簇表.这种表完成两件事情,第一,许多表物理上连接在一起存储.通常,希望数据在一个数据库块上的一张表里.对于聚簇表,来自许多张表的数据可能被存储在同一个块上;第二,包含相同聚簇码值的所有数据将物理上存储在一起.数据"聚集"在聚簇码值周围,聚簇码用B*Tree索引构建.4)散列聚簇表.和上面的聚簇表相似,但是不是用B*Tree索引有聚簇码定位数据,散列聚簇把码散列到簇中,来到达数据所在的数据库块.在散列聚簇中,数据就是索引(比喻的说法).这适合用于经常通过码等式来读取的数据.5)嵌套表6)临时表7)对象表2.术语1)高水位标记高水位标记开始在新创建的表的第一个块上.随着数据不断放到表中,使用了更多的块,从而高水标记上升.如果删除一些表中的行,高水标记仍不下移.即count(*)100000行和delete全部行后count(*)所需时间一样(全扫描情况下).需要对表进行重建.2)自由列表(freelist)在oracle中用来跟踪高水标记以下有空闲空间的块对象.每个对象至少有一个freelist和它相关.当块被使用时,oracle将根据需要放置或取走freelist.只有一个对象在高水位标记以下的块才能在freelist上发现.保留在高水标记以上的块,只有freelist为空时才能被用到.此时oracle提高高水标记并把这些块增加到freelist中.用这种方式,oracle对一个对象推迟提高高水标记,直到必须时才提高.一个对象可能不只有一个freelist,如果预料会有许多并行用户对一个对象进行大量的insert或update,配置多个freelist能够提高整体性能(可能的代价就是增加存储空间).3)pctfree和pctused如果pctfree设置为10,那么块在用完90%以前,都会使用freelist(都位于freelist中).一旦达到90%,将从freelist中移除,直到块上空闲空间超过60%以后再使用(再次进入freelist中,当pctused为40时).当pctfree设置过小,而经常更新时,容易出现行迁移高pctfree,低pctused---用于插入许多将要更新的数据,并且更新经常会增加行的大小,这样插入后再块上保留了许多空间(高pctfree),在块返回到自由列表之前,块必须几乎是空的(低pctused)低pctfree,高pctused---用于倾向于对表只使用insert或delete,或者如果要update,update也只是会使行变小.4)initial,next和pctincrease例如使用一个initial盘区为1MB,next盘区为2MB,pctincrease为50,可得到盘区应该是:(1)1mb(2)2mb(2)3mb(2的150)(4)4.5mb(3的150%).我认为这些参数是过时的,数据库应该使用局部管理并且盘区大小一致的表空间.在这种方式下,initial盘区总是等于next盘区的大小,并且不必使用pctincrease,使用pctincrease只会导致表空间产生碎片.在没用局部管理表空间的情况下,建议总是设置initial=next和pctincrease等于zero,这样可以模拟局部管理表空间的使用,为了避免碎片,所有在表空间中的对象应该使用相同盘区的分配策略.5)minextents和maxextents设置控制对象对它自己分配的盘区数.minextents为初始分配盘区个数6)logging和nologgingnologging允许对这些对象执行某些操作时不产生重做.它只影响一些特定的操作,例如开始创建对象或者使用sqlldr进行直接路径装载或者insert /*+ append */ select类型的语句.7)initrans和maxtrans对象中的每一块都有一个块头,块头的一部分是事务表,事务表中的条目描述哪一个事务块上的行/元素被锁定了.事务表的最初大小由对象的initrans设置确定,对于表,默认为1(索引默认为2),当需要时,事务表可以动态地增加,大小最多到maxtrans(假定在快上有足够的空闲空间),每一个分配的事务条目在块头上占用23字节的存储空间.2.堆表:需要注意的参数为freelists,pctfree,pctused,initrans其它参数应该使用局部惯例的表空间,不使用pctincrease,next等参数3.索引组织表索引组织表(index organized tables,iot)是存储在索引结构中的十分简单的一种表,由于堆方式存储的表是随机组织的,数据存放到任何有空间的地方,而数据在iot中是根据主码存储和排序的.iot特别使用于信息检索,空间和loap应用程序对索引块中的数据和溢出段中的数据进行正确的结合是iot建立中最关键的部分.不同的情形有不同的溢出条件,需要理解它如何影响insert,update,delete和select.如果有一个结构,构建一次,频繁读取,能尽可能地把数据存储在索引块中,如果经常修改结构,就必须在让所有数据在索引块上(利用检索)和在索引中经常重新组织数据(不利于修改)之间建立某种平衡.在堆组织表中堆freelist的考虑也适合于iot.在iot中,pctfree和pctused有两种作用,pctfree在iot中没有在堆组织表中重要,pctused通常不使用.然而当考虑overflow段时,pctfree和pctused像在堆组织表中一样有相同的含义,在溢出段中设置条目和在堆组织表中一样使用相同的逻辑.create table iot(x int,y date,z varchar2(2000),constraint iot_pk primary key(x))organization indexincluding yoveflow;这个表示列y及以前的列存储在索引块中create table iot------假设此表有2kb大小的块( x int,y date,z varchar2(2000),constraint iot_pk primary key(x))organization indexpctthreshold 10overflow;这个表示oracle将从最后一个列向前,但是不包括最好一列的主码,找出哪些列需要存储到溢出段中.本例中数字列x和日期列y总是放在索引块中,最后一列z,长度是变化的,当少于约190字节时(2kb块的10%大约是200字节,增加日期的7字节,数字3~5字节),将存储到索引块上,它超过190字节时,oracle将存储z的数据列到溢出段中,并且设置一个指针指向它pctthreshold和including哪一个好些,还是两者的某种结合更好?这要更加需要而定.如果一个应用程序总是或几乎总是使用表中开始的4列,并且很少访问最后5列,这听起来像一个使用including的程序.可以包含开始的4列,而让其余的5列存储到溢出段中.运行时,如果需要,也可采用像迁移或链接行一样的方法检索.另一方面,如果不能确定几乎总是访问这些列和很少访问其它列,可能需要考虑pctthreshold.一旦确定了每个索引块上平均存储的行数,设置pctthreshold是很容易的.假定每个索引块中想存储20行,这意味着每行是块的1/20(5%),pctthreshold的值是5,在索引块上行占用的空间不应超过块的5%.注意索引组织表一般加上参数compress 2比较好.使用索引组织表的情况:(1)当只需访问索引列,而不需访问实际的表时,即如果表列只有3列,而这3列都需要是主键时,最好采用索引组织表.(2)构建自己的索引结构,即用索引组织表建自定义索引eg.create table upper_ename(x$ename,x$rid,primarykey(x$ename,x$rid)) organization index as select upper(ename),rowid from emp;再在emp表上创建触发器更新这个索引组织表.然后就可以用这个索引组织表充当索引delete from (select ename,empno from emp where emp.rowid in (select upper_ename,x$rid from upper_ename where x$ename='KING'));注意如果导出或导入emp或在表上使用alter table move命令,导致emp表中行id变化,则需要重构索引组织表中的任何索引(3)当想要加强数据的共同定位,或者想要数据按特定的顺序物理存储时,iot就是现成的结构.4.索引聚簇表在聚簇中,单块上的数据可能来自许多表,概念上可以存储(预连接)的数据,单个表也可以使用聚簇.现在根据某些列按组存储数据,例如,所有部门10的员工都将存储在同一块上(或者如果不适合,存储在尽可能少的块上),没有存储已排序的数据(这是iot的任务),存储的是某些码结合的数据,但是以堆的方式存储.因此,部门100可能刚好和部门1相邻.在聚簇的所有表中,关于部门10的所有数据都存储到那个块上,如果部门10的所有数据在这个块中容纳不下,额外的块将链接到最初的块,来包容溢出的数据.这种方式和在iot中的溢出块非常相似.对象存储的定义(pctfree,pctused,initial等等)是和cluster相关的,因为在聚簇中有许多表,每个表在同一个块中拥有不同的pctfree 是没有意义的.create cluster emp_dept_cluster(deptno number(2)) size 1024;这个聚簇的聚类列是deptno列,在表中的这个列不必称为deptno,但是必须是number(2)来匹配这个定义.定义中有一个size1024选项,是用来告诉oracle预计有大约1024字节数据和每个聚簇码相关.oracle将使用这些信息来计算每个块能容纳的最大聚簇码数目,假定有一个8kb的块,oracle在每个数据库块中将容纳达七个聚簇码(如果数据比预料的大,数目可能减少).这就是说,部门10,20,30,40,50,60,70的数据趋向存在于一个块上,插入部门80,一个新块将会被使用.这不是说数据以分类方式存储,只是意味着,如果按照这个顺序插入部门,它们自然趋向于被放到一起.数据的大小和插入顺序都会影响每块上可以存储的码数.因此容量(size)参数控制每块上聚簇码的最大数目,太高会浪费空间,太低将得到过多的数据链接,这将偏离聚簇的目的,把所有数据存储到一起,放到一个块上,容量(size)参数是聚簇的重要参数.在把数据放入之前,需要索引聚簇,可以立刻在聚簇中创建表,但将同时创建表和为表装入数据,这样在拥有任何数据之前,需要聚簇索引. create index emp_dept_cluster_idx _disibledevent=x.deptno;end loop;end;如果先装载了所有的dept行,由于dept行非常小,只有两个字节,很显然已经得到了每个块中的七个码(基于设置的size 1024)当轮到装载emp行时,可能发行一些部门有超过1024字节的数据,这将导致这些聚簇码块的过多链接.通过同时使用指定的聚簇码装载所有的数据,把块压缩得最紧,用完空间才开始使用一个新块,不是让oracle再每块中放置七个聚簇码值,而是放置尽可能多得聚簇码值. 什么时候使用聚簇?实际上可能更容易描述何时不使用聚簇聚簇可能消极地影响dml得性能---如果预料聚簇中得表会有较大得修改就必须知道索引聚簇将可能有降低性能得副作用在聚簇中,全扫描表会受到影响---不仅仅全扫描一个表中得数据,而是必须全扫描许多表得数据如果相信将经常truncate和装载表---聚簇中得表不能截断.因此,如果大部分是读取数据,并且通过索引来读取,要么是聚簇码索引,要么方在聚簇表得其它索引,还经常把这种信息放在一起,这样使用聚簇合适.5.散列聚簇表和索引聚簇表在概念上很相似,主要区别为散列函数代替了聚簇码索引.表中得数据就是索引,却没有物理索引.oracle采用行得码值,使用内部函数或提供得函数对它进行散列运算利用这些来指定数据应放在硬盘得位置.使用散列算法来定位数据得副作用是没有在表中增加传统得索引,因此就不能区域(range)扫描散列聚簇中得表.在上面得索引聚簇中,查询:select * from emp where deptno between 10 and 20能够使用聚簇码索引找到这些行.在散列聚簇中.除非在deptno列上有索引,否则这个查询将导致全表扫描.没有使用支持区域扫描得索引,只能够在散列码中执行精确得等式搜索.在完美情况下,散列聚簇意味着可以通过一个i/o直接从查询中得到数据,这与散列算法很少甚至没有冲突.现实情况下,大部分情况可能是会发生冲突得,并且有周期性得行链接,意味着检索一些数据需要多个i/o.数据库中得散列表有固定的"大小",当创建表时,必须确定表将最终有的散列码数,其中并不限制插入的行数.散列聚簇从开始就需要分配.oracle得到hashkeys/trunc(blocksize/size)就会立即分配空间.只要在聚簇中放置了第一张表,任何全扫描都会达到所有分配的块散列聚簇中的hashkey数是固定大小的.能限制为这个簇产生的唯一散列码的数量.如果设置太低,由于预料不到的散列冲突可能影响性能.在聚簇码上的区域扫描是不能用的.以下情形散列聚簇是合适的:在一定程度上精确知道在整个过程中会有多少行,或者如果合理的上限,正确地设置hashkey大小size参数.对避免重构是关键的.DML,尤其是插入,不要大量执行.总是通过hashkey值经常访问数据.6)临时表create global temporary table temp_table_sessionon commit preserve rowsasselect * from scott.emp where 1=0;on commit preserve rows语句使之成为基于会话的临时表,行将留在此表中,直到会话断开或通过delete或truncate从物理上删除这些数据,只有自己的会话能看到这些行.其它会话不能看到"我的"行数据,即使是在commit之后.create global temporary table temp_table_transactionon commit delete rowsasselect * from scott.emp where 1=0;on commit delete rows 使之成为基于事务的临时表.当会话提交后,行消失.通过简单地恢复分配到表的临时盘区,行就会消失.在这个临时表自动清除过程中不涉及额外开销.对于每一个数据库,创建所有的temp表作为全局临时表.这将作为应用程序安装的一部分完成.就像创建永久表一样.只要在过程中简单使用即可.即不要在存储过程中创建临时表.临时表可能有触发器,检查约束,索引等等.但是不支持如下:没有用作参照完整性约束---既不能是外码的目标,也不能在上面定义外码.不能有varray或者nested table类型的列,不能是索引组织表,不能是索引或散列聚簇,不能分区.通过analyze表命令不能产生统计信息.在oracle中使用临时表是没有必要的(如果是为了避免查询查询中涉及到的表太多,而将子查询结果放到临时表中的话)然而在其它情况,在程序中使用临时表是正确的方法由于analyze命令不能在临时表中收集统计信息,必须使用手动方法,把临时表的有代表性的统计信息装载到数据字典.例如,如果临时表中行的平均数量是500,平均行大小是100字节和块的数量是7.只使用begindbms_stats.set_table_stats(ownname=>user,tabname=>'T',numrows=>500,numblks=>7,avgrlen=>100); end;现在,优化器不能使用它的猜测,而使用我们的猜测结果.或者:删除临时表一段时间,创建一个名字和结构相同的永久表,并用代表性的数据来装载,然后尽可能彻底地分析这张表(也可能产生柱状图等等)并且使用dbms_stats输出这张永久表的统计信息,然后删除这张永久表,重新创建临时表,然后所有需要做的就是输入代表性的统计信息和让优化器正确地工作.在任何情况下,访问超过表的10%-20%,都不应该使用索引.取出统计信息begindbms_stats.create_stat_table(ownname=>user,stattab=>'STATS');dbms_stats.export_table_stats(ownname=>user,tabname=>'TEMP_ALL_OBJECTS',stattab=>'STATS');dbms_stats.export_index_statsownnam e=>user,indname=>'TEMP_ALL_OBJECTS_IDX',stattab=>'STATS');end;导入统计信息begindbms_stats.import_table_stats(ownname=>user,tabname=>'TEMP_ALL_OBJECTS',stattab=>'STATS');dbms_stats.import_index_stats(ownname=>user,indname=>'TEMP_ALL_OBJECTS_IDX',stattab=>'STATS'); end;在应用程序中临时表是有用处的,可以临时存储其它表,会话或事务需要的一组集.这并不意味着用来把单个较大的查询"分成"可以重新连接在一起的小结果集(在其它数据库中,这好像是临时表最流行的用法)当有机会把一系列到临时表的insert写成以一个大查询的形势的select时,执行速度会大大加快。
数据库聚集索引和非聚集索引
数据库聚集索引和非聚集索引
1.什么是聚集索引
聚集索引(clustered index)是一种特殊的索引,它可以把数据表中的记录按照关键字排序,使得索引有序而连续。
一个数据表只能有一个聚集索引,也就是说,一个数据表只能有一种排序方式。
每次插入一条新的记录,都会建立一个新的索引,来保持整个索引的顺序。
查询时,聚集索引会把查询的结果以排好序的方式返回给客户端,从而提高查询效率。
2.什么是非聚集索引
非聚集索引(non-clustered index)是一种用来加速查询的数据库结构,它实际上是一个指向真实数据表的索引,提供了查询时可以快速定位真实数据表中记录的功能。
非聚集索引本身没有任何排序,而是按照索引的键,建立一种新的排列顺序,以便快速检索数据。
非聚集索引可以提高查询效率,但是其建立的额外空间开销比聚集索引要大。
3.聚集索引与非聚集索引的区别
(1)聚集索引实际上是表中的数据,而非聚集索引只是一个指向真实数据表的索引。
(2)聚集索引自身有序,而非聚集索引本身没有任何排序,但是按照索引的键可以快速检索数据。
(3)一个数据表只能有一个聚集索引,而一个数据表可以有多
个非聚集索引。
(4)聚集索引的建立需要消耗更多的空间,而非聚集索引的建立需要的空间更少。
oracle索引原理详解Oracle数据库中的索引是用于提高数据检索速度的重要工具。
了解Oracle索引的原理对于数据库管理员和开发人员来说是非常重要的。
一、索引的基本概念索引是Oracle数据库中的一个对象,它可以帮助数据库系统更快地检索数据。
索引类似于书籍的目录,可以快速定位到所需的数据。
二、索引的分类1. B-Tree索引:这是Oracle中最常用的索引类型,基于平衡多路搜索树(B-Tree)实现。
B-Tree索引适用于大多数数据类型,包括字符、数字和日期等。
2. Bitmap索引:位图索引主要用于处理包含大量重复值的列。
通过位图索引,可以更高效地处理这些列的查询。
3. 函数基索引:函数基索引允许在列上应用函数,然后对该结果进行索引。
这可以用于优化包含函数操作的查询。
4. 反转键索引:反转键索引是一种特殊类型的B-Tree索引,用于优化插入操作。
通过反转键顺序,可以更高效地处理插入操作。
三、索引的创建和维护1. 创建索引:创建索引的基本语法是“CREATE INDEX index_name ON table_name (column_name)”。
其中,index_name是索引的名称,table_name是要创建索引的表名,column_name是要索引的列名。
2. 维护索引:定期维护索引可以确保其性能和可靠性。
常用的维护操作包括重建索引(REBUILD INDEX)和重新组织索引(ORGANIZE INDEX)。
四、索引的优点和缺点1. 优点:使用索引可以显著提高数据检索速度,减少查询时间。
此外,索引还可以用于优化复杂查询的性能。
2. 缺点:虽然索引可以提高性能,但它们也会占用额外的磁盘空间。
此外,当表中的数据发生变化时,索引也需要更新,这可能会影响写操作的性能。
五、最佳实践1. 在经常用于搜索和排序的列上创建索引。
2. 根据查询模式和数据分布选择合适的索引类型。
3. 定期分析和维护索引,确保其性能和可靠性。
一.索引介绍1.1 索引的创建语法:CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>ON <schema>.<table_name>(<column_name> | <expression> ASC | DESC,<column_name> | <expression> ASC | DESC,...)TABLESPACE <tablespace_name>STORAGE <storage_settings>LOGGING | NOLOGGINGCOMPUTE STATISTICSNOCOMPRESS | COMPRESS<nn>NOSORT | REVERSEPARTITION | GLOBAL PARTITION<partition_setting>相关说明1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression 时即“基于函数的索引”3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)4)STORAGE:可进一步设置表空间的存储参数5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)6)COMPUTE STATISTICS:创建新索引时收集统计信息7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区1.2 索引特点:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
oracle索引的原理Oracle索引的原理概述Oracle数据库中的索引是一种用于加速数据访问的数据结构。
索引可以提高查询效率,减少数据扫描次数,从而加快查询速度。
本文将介绍Oracle索引的原理,包括索引类型、创建、维护和使用等方面。
索引类型Oracle数据库中常见的索引类型包括B树索引、位图索引和函数索引。
B树索引是最常用的一种索引,它使用B树数据结构存储键值对,支持范围查询和排序操作;位图索引适用于大规模数据集合中的低基数列(即取值范围较小的列),它将每个取值映射为一个位图,在查询时可以快速定位符合条件的行;函数索引是针对函数表达式建立的一种特殊类型的索引,可以在查询时优化函数表达式计算过程。
创建索引在Oracle数据库中,可以通过CREATE INDEX语句来创建一个新的索引。
在创建时需要指定要创建的表名、列名和所选用的索引类型等参数。
例如:CREATE INDEX idx_name ON table_name (column_name) TABLESPACE tablespace_name;其中idx_name为要创建的新索引名称,table_name为要创建索引所在表名,column_name为要创建所选用列名。
维护和使用在使用Oracle索引时,需要注意维护和使用的问题。
首先,索引需要定期维护以保证其性能和稳定性。
例如,可以使用ANALYZE TABLE语句来收集表和索引的统计信息,以便优化查询计划。
其次,在查询时应该尽量避免全表扫描,而是应该利用索引进行快速定位符合条件的行。
例如,在WHERE子句中使用索引列或者在ORDER BY子句中使用索引列等。
优化技巧在Oracle数据库中,可以通过一些优化技巧来提高索引的效率和性能。
例如:1.选择正确的索引类型:不同的查询需要不同类型的索引支持,因此需要根据实际情况选择合适的索引类型。
2.合理设计复合索引:复合索引是指包含多个列的联合索引,在设计时需要考虑到查询条件中涉及到哪些列,并将这些列作为复合索引的组成部分。
第6章Oracle索引与聚簇
6.1 索引的概念
6.2 创建索引
6.3 索引的维护
6.4 聚簇
6.1.1
索引的概念
6.1.2 索引的分类6.1索引的概念
6.1.1索引的概念
索引允许Oracle 9i更快地访问数据。
系统创建了这个内部的数据结构(即索引),它导致当查询以列为索引的时候搜索行,这样查询会快得多。
这个索引对于给定的列值通知Oracle 9i找到表中某一行,这有点类似书的索引,它告诉你对于给定的关键字你能找到哪一页。
从内部结构看,索引就是一个表。
索引具有多行数据,在索引的列中包括一个索引的列的拷贝和在被索引的表的相应的行ID。
6.1.2索引的分类
Oracle 9i采用了多种新颖的索引算法以显著地提高Oracle查询数据库的速度,主要有b-tree索引、唯一索引,非唯一索引,位图索引、分区索引、未排序索引、逆序索引、函数索引等几种。
另外,按照索引所包含的列数可以把索引分为单列索引和复合索引。
索引列只有一列的索引称为单列索引;对多个列同时索引称为复合索引。
6.2创建索引
6.2.1 在OEM中创建索引6.2.2 使用SQL命令创建索引
6.2.1 在OEMC中创建索引
在OEMC树型视图中,鼠标右键单击要创建索引的表,从快捷菜单中选择“创建索引,建于…”选项,打开创建索引窗口。
创建索引窗口包含:一般信息、分区、存储和选项4个标签页。
创建索引可以对表的一个或多个列定义索引,也可以对列表达式定义索引。
索引是一个方案对象,它包含显示在表中已编制索引的列,并且可直接迅速地访问行。
6.2.2 使用SQL命令创建索引
1.创建索引的语法形式
CREATE [UNIQUE | BITMAP] INDEX
index_name
ON table_name
(column_name[ASC | DESC][,column_name[ASC | DESC]] …)
[CLUSTER cluster_name]
[INITRANS n] [MAXTRANS n] [PCTFREE n] [STORGE storage]
[TABLESPACE tablespace_name]
6.2.2 使用SQL命令创建索引
2. 参数说明
其中UNIQUE指定索引所基于的列(或多列)值必须唯一;默认的索引是非唯一索引。
Oracle 9i建议不要在表上显示定义唯一索引;BITMAP指定建立位图索引而不是b-tree索引;index_name表示创建的索引名字;table_name指要创建索引的表;cluster_name指创建索引的簇;n可以为任意正整数值;tablespace_name表示要用于该索引的表空间。
6.2.2 使用SQL命令创建索引
只有确保拥有CREATE ANY INDEX系统权限时,才能使用CREATE INDEX语句。
像INIYTRANS,MAXTRANS,PCTFREE,STORAGE,TABLESPACE等与存储有关的参数可以使用用户定义的缺省值。
参数No sort告诉Oracle 9i该表已经排序因此不需要再重新排序。
6.3索引的维护
6.3.1 在OEMC中维护索引6.3.2 使用SQL命令维护索引
6.3.1 在OEMC中维护索引
索引创建之后,在使用过程中可以根据需要进行修改,也可以删除不再使用的索引。
1. 查看编辑索引
在OEMC中,选择方案管理中要进行管理的索引,单击鼠标右键从快捷菜单中选择“查看/编辑详细资料”项,打开编辑索引窗口。
“编辑索引”包括5个标签页,其中“一般信息”、“分区”、“存储”和“选项”四个标签页与创建索引的各对应标签页相同。
6.3.1 在OEMC中维护索引
2. 删除索引
在OEMC中,选择要删除的索引,从快捷菜单中选择“移去”项,则完成删除索引操作。
6.3.2 使用SQL命令维护索引
1. 查询索引信息
索引一旦建立之后,关于索引的信息就被放置到数据字典USER_INDEXS和USER_IND_COLUMNS中 USER_INDEXES表
USER_INDEXES表中存放了用户所建立的索引信息。
6.3.2 使用SQL命令维护索引
USER_IND_COLUMNS表
一般情况下,索引列信息不能显示,系统提供的USER_IND_COLUMNS表就能够解决这个问题。
USER_IND_COLUMNS表存放用户索引的列信息或用户表上的列信息。
6.3.2 使用SQL命令维护索引
2. 修改索引
索引的修改主要指修改索引的存储和事务参数。
而索引表达式就是列名,没有什么可更改的。
使用SQL语句修改存储参数的通用语法如下:
ALTER [UNIQUE] INDEX index_name [INITRANS n]
[MAXTRANS n]
[STORAGE n]
6.3.2 使用SQL命令维护索引
3. 删除索引
当一些索引不再使用时,可以从数据库中删除它。
DROP INDEX index_name
其中index_name表要从数据库删去的索引名。
6.4.1在OEM
中创建聚簇6.4.2使用SQL命令创建聚簇6.4聚簇
6.4.1 在OEM中创建聚簇
在OEMC树型视图方案文件夹中,选择簇文件夹,
单击鼠标右键,从快捷菜单中选择“创建”选项。
创建簇窗口有3个标签页。
1.“一般信息”标签页用来设置名称、方案、表空间、大小、索引簇、簇关键字列;
6.4.1 在OEM中创建聚簇
2.“存储”标签页用来设置簇的存储参数;
3.“选项”标签页用来设置并行选项和高速缓存选项;
对3个标签页的选项设置后,单击“创建”按钮,则显示创建成功信息对话框,单击“确定”按钮,完成创建簇的操作。
6.4.1 在OEMC中创建聚簇
4. 簇的使用
创建簇之后,就可以把相关的,经常同时查询的表
建立在同一个簇上,指定表为簇的一部分,并指定
表列和簇列的关联。
如果经常同时访问多个表,则可以把这些表物理地
存放在一起,从而减少I/O操作次数,提高系统效率。
这些物理地存储在一起的表需要管理容器,这个容
器就是簇,又称为聚簇。
6.4.2 使用SQL命令创建聚簇
1.索引聚簇
聚簇的条件是两个或多个表之间必须有一个公共列名,根据公共列名建立相应的聚簇,这个公共列称为聚簇键值。
创建索引聚簇
为创建一个索引聚簇,先应在数据库中创建一个聚簇,并指定用于连接两个表的列的数据类型和大小,然后在该聚簇上创建索引,最后指定在聚簇上使用CREATE TABLE语句创建表。
6.4.2 使用SQL命令创建聚簇
查询聚簇信息
可以从USER_CLUSTERS数据字典查询聚簇信息。
索引聚簇的应用
建立起索引聚簇之后,其中包含的每个表仍可以单独方式进行操作,也可以使用聚簇特性进行查询。
6.4.2 使用SQL命令创建聚簇
2. 散列聚簇
散列聚簇的基本概念
散列(Hash)实质上是一种将符号名变为地址的方法。
散列聚簇是将具有同一散列码值的记录存储在一起,每一记录的散列值是聚簇散列函数返回的值。
建立一个散列聚簇时,可指定一散列函数或使用Oracle内部的散列函数。
6.4.2 使用SQL命令创建聚簇
创建散列聚族
在建立散列聚簇时,既要指定聚簇列值,还要指定散列列值,后者可使用HASH IS关键词来说明。
6.4.2 使用SQL命令创建聚簇
3. 维护聚簇
修改聚簇
聚簇一旦建立,就可以使用ALTER CLUSTER
命令进行修改。
修改聚簇主要是修改其存储参数,包括SIZE,PCTUSED,INITRANS,MAXTRANS和STORAGE。
6.4.2 使用SQL命令创建聚簇
删除聚簇
可以直接使用DROP命令删除聚簇,其格式如下:DROP CLUSTE cluster_name [INCLUDING TABLES] [CASCADE CONSTRAINTS]
其中cluster_name表示想从数据库中删除的簇名,INCLUDING TABLES表示要删除聚簇中的全部表,CASCADE CONSTRAINTS表删除全部约束。