Oracle索引原理
- 格式:doc
- 大小:144.00 KB
- 文档页数:7
oracle查询表索引语句Oracle是一种关系型数据库管理系统,可以使用SQL语言进行数据查询和操作。
在Oracle中,索引是一种特殊的数据库对象,它可以提高查询效率和数据访问速度。
索引可以根据一个或多个列值进行排序,并且可以通过索引来快速定位到满足查询条件的数据行。
下面列举了一些常用的Oracle查询表索引的语句。
1. 查看表的索引信息:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名';```这个语句可以查询指定表的所有索引,包括索引名称、索引所在的表以及索引列。
2. 查看表的主键索引:```sqlSELECT constraint_name, column_nameFROM all_cons_columnsWHERE table_name = '表名'AND constraint_name = 'PK_表名';```这个语句可以查询指定表的主键索引,包括主键约束名称以及主键列。
3. 查看表的唯一索引:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名'AND uniqueness = 'UNIQUE';```这个语句可以查询指定表的唯一索引,包括索引名称、索引所在的表以及索引列。
4. 查看表的非唯一索引:```sqlSELECT index_name, table_name, column_nameFROM all_ind_columnsWHERE table_name = '表名'AND uniqueness = 'NONUNIQUE';```这个语句可以查询指定表的非唯一索引,包括索引名称、索引所在的表以及索引列。
Oracle 分区索引和全局索引对于分区表而言,每个表分区对应一个分区段。
当在分区表上建立索引时,即可以建立全局索引,也可以建立分区索引。
对于合局索引,其索引数据会存放在一个索引段中;而对于分区索引,则索引数据都会被存放到几个索引分区段中。
对索引进行分区的目的与对表进行分区是一样的,都是为了更加易于管理和维护巨型对象。
在Oracle中,一共可以为分区表建立三种类型的索引,下面分别介绍它们的特点和适用情况。
1.本地分区索引本地分区索引是为分区表中的各个分区单独地建立分区,各个索引分区之间是相互独立的。
本地分区索引相对比较简单,也比较容易管理。
图10-4显示了本地分区索引和分区表之间的对应关系:分区索引分区表图10-4 本地分区索引与分区表在为分区表创建本地索引后,Oracle会自动对表的分区和索引的分区进行同步处理。
如果为分区表添加新的分区后,Oracle会自动为新分区建立新的索引。
与此相反,如果表的分区依然存在,则用户将不能删除它所对应用的索引分区。
在删除表的分区时,系统会自动删除所对应的索引分区。
例如,下面的语句为范围分区表SALES_RANGE创建本地分区索引:SQL> create index sales_local_idx2 on sales_range(customer_id) local;索引已创建。
2.全局分区索引全局分区索引是对整个分区表建立的索引,然后再由Oracle对索引进行分区。
全局分区索引的各个分区之间不是相互独立的,索引分区与分区表之间也不是简单的一对一关系。
图10-5显示了全局分区索引与分区表的对应关系。
分区索引分区表图10-5 全局分区索引与分区表例如,下面的语句为分区表SALES_LIST创建全局分区索引:SQL> create index sales_global_part_idx2 on sales_list(customer_id)3 global partition by range(customer_id)4 (5 partition part1 values less than(300) tablespace space01,6 partition part2 values less than(maxvalue) tablespace space027 );索引已创建。
oracle索引优化原则Oracle索引是数据库优化中非常重要的一部分,它们能够在查询数据时提高查询效率和性能。
然而,在使用Oracle索引时,需要遵守一些原则,以便最大程度地提高查询效率和性能。
以下是一些Oracle索引优化的原则。
1.只在需要时使用索引Oracle索引能够帮助我们提高查询效率和性能,但它们也会降低更新和插入数据的速度。
因此,我们应当仅在需要时使用索引。
如果使用过多的索引,会导致查询语句变得复杂并且更新和插入速度变慢,从而影响整个数据库系统的性能。
2.使用唯一性索引唯一性索引可以帮助我们避免重复数据的插入和更新。
当数据库表中的某个列需要具有唯一性时,我们可以使用唯一性索引来实现。
这将确保同一列中的值不重复,从而提高整个数据库系统的性能。
3.使用复合索引如果查询语句需要同时查询多个列,我们可以使用复合索引来提高查询效率和性能。
使用复合索引时,需要注意索引的顺序,应该从前往后按照查询条件的顺序构建索引。
这样可以避免Oracle优化器无法使用索引而导致的全表扫描。
4.选择正确的索引类型Oracle提供不同的索引类型,包括B树索引、位图索引、函数索引等。
在选择索引类型时,我们应当根据查询语句的类型和数据的特点来选择最适合的索引类型。
例如,如果查询语句需要对大量的布尔类型或枚举类型数据进行查询,那么位图索引可能比B树索引更适合。
5.避免过度索引化过多的索引将会降低数据库系统的性能,每个索引都需要消耗一定的内存和磁盘空间,使得查询和更新操作变得更慢。
因此,我们应避免对相同的列建立多个重复的索引,并仅为确实需要的列创建合适的索引。
6.定期维护索引当数据表中的数据发生变化时,索引也需要随之更新。
因此,我们需要定期进行索引维护和优化,以确保索引数据与实际数据的一致性。
这样可以避免索引中出现“死数据”,也可以提高查询效率和性能。
在某些情况下,Oracle优化器会选择错误的索引,从而影响查询效率和性能。
oracle的索引类型
Oracle数据库中常见的索引类型包括:1. B树索引(B-tree Index):是Oracle 默认的索引类型,适用于等值查找和范围查找。
2. 唯一索引(Unique Index):确保索引列的值在表中是唯一的。
3. 聚集索引(Cluster Index):按照表的物理存储顺序进行索引,适用于频繁进行范围查找的列。
4. 位图索引(Bitmap Index):将索引列的不同值分组为位图,并对每个位图使用压缩算法,适用于低基数列(取值范围较小)。
5. 函数索引(Function-Based Index):基于表达式或函数的结果构建的索引,适用于计算、转换或覆盖列的查询。
6. 虚拟列索引(Virtual Column Index):基于虚拟列(由表达式计算而来)构建的索引。
7. 全文索引(Full-Text Index):适用于对文本数据进行全文搜索的场景。
8. 空间索引(Spatial Index):适用于对地理位置和空间数据进行查询和分析。
9. 哈希索引(Hash Index):根据哈希函数计算的值来构建索引,适用于等值查询的索引。
10. 反向索引(Reverse Key Index):逆序存储索引键的位模式,适合于高度并发且插入操作有序的情况。
需要根据具体业务和查询需求选择合适的索引类型,以提高查询性能。
oracle where 条件强制索引写法在Oracle数据库中,索引是一种重要的数据结构,可以提高查询性能。
然而,有时候在编写WHERE条件时,我们可能会遇到一些特殊情况,导致无法使用索引。
在这种情况下,我们可以使用强制索引写法来确保Oracle使用正确的索引来执行查询。
首先,让我们了解一下什么是强制索引。
在Oracle数据库中,强制索引是与常规索引不同的特殊索引。
当常规索引无法满足查询条件时,我们可以使用强制索引来告诉数据库应该使用哪种索引来执行查询。
这通常通过在WHERE条件中使用特定的标识符来实现。
1. 使用EXISTS强制索引:如果查询使用了EXISTS子查询,并且需要使用特定的索引,可以使用强制索引来确保数据库使用正确的索引。
例如,假设我们有一个名为“table_name”的表,其中有一个名为“column_name”的列,我们希望使用该列上的索引来执行查询。
可以使用以下强制索引写法:```scssSELECT * FROM table_name WHERE EXISTS (SELECT 1 FROM dual WHERE column_name = 'value')```在这个例子中,我们使用了EXISTS子查询来执行查询,并在WHERE条件中指定了特定的值。
由于使用了强制索引写法,Oracle将使用“column_name”列上的索引来执行查询。
2. 使用函数强制索引:有时候,WHERE条件中的值需要经过函数处理才能使用特定的索引。
在这种情况下,可以使用函数强制索引来确保数据库使用正确的索引。
例如,假设我们有一个名为“table_name”的表,其中有一个名为“column_name”的列,该列上的值需要进行函数处理才能使用索引。
可以使用以下强制索引写法:```sqlSELECT * FROM table_name WHERE column_name = TO_NUMBER('value')```在这个例子中,我们将“value”转换为数字类型,以便使用TO_NUMBER函数强制将值绑定到特定索引上。
Oracle的临时表一、表的种类1:永久表:非私有数据,需要DML锁。
2:临时表:临时表的定义对所有会话都是可见的,处理事务或会话期存在的私有数据,不需要DML锁,对于临时表的DML语句不生成重做日志,临时表占用临时表空间,临时表的数据是自动删除的,在临时表上建的索引也是临时的。
二、临时表的种类1:事物型临时表:在事务期间数据存在,事务结束后数据被自动删除。
2:会话型临时表:在会话期间数据存在,会话结束后数据被自动删除。
三、临时表的限制1:不能分区,不能是索引组织表或簇。
2:不能指定关于临时表的外键约束。
3:不支持并行DML或并行查询。
4:不支持分布式事务处理。
5:不能指定段存储语句、嵌套表存储语句或并行语句四、建立临时表的语法1:建立关系表2:建立对象表3:并行语句Oracle的分区表一、什么是分区表Oracle可以将大表或索引分成若干个更小更方便管理的部分,每一部分称为一个分区,这样的表称为分区表。
SQL语句使用分区表比全表或全表索引能提供更好的访问和处理数据。
下图是按周所建分区表示例。
二、使用分区表的限制1:不能分割是簇一部分的表。
2:不能分割含有LONG或LONG RAW列的表。
3:索引组织表IOT不能进行范围分区。
**采用基于规则的优化器时,有会从分区表中受益!三、分区方法1:范围分区(更适合历史数据库)—Oracle8从惟一可用的分区类型按照列的列表的范围分割表;如果是索引组织表,则列的列表就必须是索引组织表主键的子集。
分区关键列的限制:列列表中的列可以是任何一种内置的数据类型,ROWID、LONG、LOB或者TIMESTAMP WITH TIME ZONE除外。
关键字MAXVALUE比任何值都高(含NULL)。
2:散列分区--Oracle8i可用的分区类型指定这个表是按哈希算法分区的,分区的数目应为2的幂。
1)单独散列分区(individual_hash_partitions)及其限制使用子名按照名字指定单个分区,分区名可以匆略。
oracle强制索引语法
Oracle强制索引语法是指在查询语句中使用FORCEINDEX关键字来强制使用某个特定的索引。
该语法可以优化查询性能,但需要谨慎使用,因为不当使用可能会影响数据库性能。
FORCE INDEX语法的基本用法是在SELECT语句中添加FORCE INDEX关键字,后跟要使用的索引的名称。
例如:
SELECT * FROM my_table FORCE INDEX (my_index);
在这个例子中,查询将强制使用名为“my_index”的索引。
此外,还可以使用FORCE INDEX来强制使用多个索引,如:
SELECT * FROM my_table FORCE INDEX (my_index1, my_index2);
在这个例子中,查询将强制使用名为“my_index1”和“my_index2”的两个索引。
需要注意的是,FORCE INDEX语法只对SELECT语句有效,对于其他类型的SQL语句(如INSERT或UPDATE),该语法无效。
在使用FORCE INDEX时需要注意以下几点:
1. 强制使用索引可能会绕过数据库优化器,导致查询性能变差。
2. 如果使用的索引不适合当前查询,将会导致查询性能变差。
3. 强制使用索引可能会导致锁定表或索引,从而影响其他查询的性能。
综上所述,Oracle强制索引语法可以提高查询性能,但需要谨慎使用。
在实际应用中,应该根据实际情况选择是否使用该语法,以达到最优的查询性能。
- 1 -。
Oracle:查找表的主键,外键,唯一性约束,索引1、查找表的所有索引(包括索引名,类型,构成列):select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表2、查找表的主键(包括名称,构成列):select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name =au.constraint_name and au.constraint_type = 'P' and au.table_name = 要查询的表3、查找表的唯一性约束(包括名称,构成列):select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'U' and au.table_name = 要查询的表4、查找表的外键(包括名称,引用表的表名和对应的键名,下面是分成多步查询):select * from user_constraints c where c.constraint_type = 'R' and c.table_name = 要查询的表查询外键约束的列名:select * from user_cons_columns cl where cl.constraint_name = 外键名称查询引用表的键的列名:select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名5、查询表的所有列及其属性select t.*,MENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查询的表。
Oracle数据库中建⽴索引的基本⽅法讲解怎样建⽴最佳索引?1、明确地创建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0);2、创建基于函数的索引常⽤与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;3、创建位图索引对基数较⼩,且基数相对稳定的列建⽴索引时,⾸先应该考虑位图索引,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name;4、明确地创建唯⼀索引可以⽤create unique index语句来创建唯⼀索引,例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;5、创建与约束相关的索引可以⽤using index字句,为与unique和primary key约束相关的索引,例:alter table table_nameadd constraint PK_primary_keyname primary key(field_name)using index tablespace tablespace_name;如何创建局部区索引?1)基础表必须是分区表2)分区数量与基础表相同3)每个索引分区的⼦分区数量与相应的基础表分区相同4)基础表的⾃分区中的⾏的索引项,被存储在该索引的相应的⾃分区中,例如create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage(MaxExtents 32768PctIncrease 0FreeLists 1FreeList Groups 1)local/如何创建范围分区的全局索引?基础表可以是全局表和分区表create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than ('0106')partition p01_idx vlaues less than ('0111')...partition p01_idx vlaues less than ('0401'))/如何重建现存的索引?重建现存的索引的当前时刻不会影响查询重建索引可以删除额外的数据块提⾼索引查询效率alter index idx_name rebuild nologging;对于分区索引alter index idx_name rebuild partition partition_name nologging;删除索引的原因?1)不再需要的索引2)索引没有针对其相关的表所发布的查询提供所期望的性能改善3)应⽤没有⽤该索引来查询数据4)该索引⽆效,必须在重建之前删除该索引5)该索引已经变的太碎了,必须在重建之前删除该索引语句:drop index idx_name;drop index idx_name partition partition_name;建⽴索引的代价?基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,主要表现在CPU和I/O上。
Oracle的索引类型总结1)b-tree索引 Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。
每当你发布基本的没有经过进⼀步修改的CREATE INDEX语句时,就是在创建b-tree索引。
这⾥不打算对b-tree索引进⾏更多深⼊的探讨,这些⽤户都可以⾃⼰了解。
基本上这些索引存储你创建的索引所在的列值以及⽤来查找⾃⾝⾏的指向实际数据表的指针。
记住,这也就意味着要进⾏多路查询,其中⼀个查询各个节点和索引的叶节点,然后才是表的⾏⾃⾝。
这就是为什么Oracle的优化器在某种情况下会选择执⾏全表扫描⽽不执⾏索引查找的原因了,因为全表扫描执⾏起来实际上可能会更快⼀些。
还要注意的是,如果你的索引是创建在多个列上的话,那么第⼀列(leading column)⾮常重要。
假设你有⼀个多列索引(也称为级联索引),索引列的排列顺序是c列到d列,你可以对使⽤该索引c列单独进⾏⼀次查询,但你不能使⽤该索引对d列冶⾦⾏⼀次单独的查询。
2)基于函数的索引 如果在搜索时你读取很多⾏,或者你的索引选择性不⼤,⼜或者你在级联索引中使⽤了第⼀列以外的列,Oracle数据库有时候会选择不使⽤索引。
那么如果你想要执⾏⼀个⼤⼩写不敏感的搜索呢?像下⾯的指令:WHERE UPPER(first_name) = ‘JOHN’。
这也不会使⽤first_name字段上的索引。
为什么?因为Oracle不得不将UPPER函数⽤在该索引所有(ALL)的值上,所以还不如做⼀次全表扫描。
所以,很多时候Oracle创建基于函数的索引就是为了这个⽬的。
3)反转关键字索引 你还可以看到这些反转关键字索引,⽽且不时还要⽤到这些索引。
假设有⼀列包含了“餐厅甲”、“餐厅⼄”、“餐厅丙”等类似名字。
可能这不是⼀个很好的例⼦,不过关键的⼀点是拥有很多唯⼀值,但其关键字的前⾯⼀部分变化不⼤。
因为Oracle会在将REVERSE关键字指定给b-tree前把 REVERSE字符串简化,所以使⽤反转关键字索引可能是最好的。
全文检索(oracle text)Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力,Oracle Text是Oracle9i采用的新名称,在oracle8/8i中被称为oracle intermedia text,oracle8以前是oracle context cartridge。
Oracle Text的索引和查找功能并不局限于存储在数据库中的数据。
它可以对存储于文件系统中的文档进行检索和查找,并可检索超过150种文档类型,包括Microsoft Word、PDF和XML。
Oracle Text查找功能包括模糊查找、词干查找(搜索mice 和查找mouse)、通配符、相近性等查找方式,以及结果分级和关键词突出显示等。
你甚至可以增加一个词典,以查找搭配词,并找出包含该搭配词的文档。
Oracle text 需要为可检索的数据项建立索引,用户才能够通过搜索查找内容,索引进程是根据管道建模的,在这个管道中,数据经过一系列的转换后,将其关键字会添加到索引中。
该索引进程分为多个阶段,如下图1.数据检索(Datastore):只是将数据从数据存储(例如web页面、数据库大型对象或本地文件系统)中取出,然后作为数据流传送到下一个阶段。
2. 过滤(Filter):过滤器负责将各种文件格式的数据转换为纯文本格式,索引管道中的其他组件只能处理纯文本数据,不能识别 Ms word 或 excel 等文件格式。
3. 分段(Sectioner):分段器添加关于原始数据项结构的元数据。
4. 词法分析(Lexer):根据数据项的语言将字符流分为几个字词。
5. 索引(Index):最后一个阶段将关键字添加到实际索引中。
测试环境:Linux AS release 4 (Nahant Update 3), oracle10g(10.2.0.2.0)内容简介:本文档主要以实验为主,文档中包含了大量的实验例子,部分测试用例来自document,部分来自网友的测试,所有的例子都在oracle10g中测试通过。
第一章简答题1.简述Oracle数据库逻辑结构中各元素之间的关系。
答:数据库由若干个表空间组成,表空间由表、索引、视图等逻辑对象组成,表由段组成,段由区组成,区则由数据块组成。
2.简述Oracle数据库物理结构中包含的文件类型,以及不同类型文件所能起的作用。
答:物理结构由构成数据库的操作系统文件所决定。
每个Oracle数据库都由3种类型的文件组成:数据文件、日志文件和控制文件。
Oracle数据库有一个或多个物理的数据文件。
数据库的数据文件包含全部数据库数据。
逻辑数据物理地存储在数据文件中。
每个数据库有两个或多个日志文件组,日志文件组用于收集数据库日志。
日志的主要功能是记录对数据所作的修改,所以对数据库作的全部修改记录在日志中。
在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到修改记录,从而保证已经发生的操作成果不会丢失。
每个Oracle数据库有一个控制文件,记录数据库的物理结构。
控制文件包含数据库名、数据库数据文件和日志文件的名字、位置和数据库建立日期等信息。
3.简述SGA所包含的数据结构及其描述信息。
答:SGA是一组共享内存结构,其中包含一个Oracle数据库例程数据及控制信息。
如果有多个用户同时连接到同一个例程,则此例程的SGA数据由这些用户共享。
因此,SGA也称为共享全局区(Shared Global Area)。
SGA包含以下数据结构。
∙数据库缓冲区:SGA用来保存从数据文件中读取的数据块。
∙重做日志缓冲区:SGA中的循环缓冲区,用于记录数据库发生改变的信息。
∙共享池:用于保存用户程序。
∙Java池:为Java命令提供语法分析。
∙大型池:数据库管理员配置的可选内存区域,用于分配大量的内存。
4.简述Oracle数据库管理员的主要职责。
答:数据库管理员的主要职责如下。
∙安装和升级Oracle数据库服务器和其他应用工具。
∙分配系统存储空间,并计划数据库系统未来需要的存储空间。
oracle重建分区索引语句摘要:1.简介2.Oracle数据库中的分区索引3.重建分区索引的必要性4.重建分区索引的语句5.总结正文:1.简介在Oracle数据库中,分区索引是一种提高查询性能的有效方法。
分区索引基于表中的一个或多个列,将数据划分为多个区,每个区包含相同类型的数据。
这使得查询只需要扫描相关的分区,而不是整个表,从而提高了查询速度。
然而,随着时间的推移,分区索引可能会变得碎片化,导致性能下降。
在这种情况下,重建分区索引是一个好的解决方案。
2.Oracle数据库中的分区索引在Oracle数据库中,分区索引是表空间中一个或多个表的索引。
分区索引基于一个或多个分区键(partition key)进行分区,分区键可以是单个列或多个列。
每个分区包含与分区键值相匹配的数据。
3.重建分区索引的必要性分区索引在提高查询性能方面具有很大优势,但随着时间的推移,分区索引可能会变得碎片化。
碎片化会导致查询性能下降,因为数据库需要更多的时间来查找和读取数据。
重建分区索引可以解决这一问题,将数据重新组织到更均匀的方式,从而提高查询性能。
4.重建分区索引的语句要重建分区索引,可以使用以下ALTER INDEX语句:```ALTER INDEX index_nameREBUILD PARTITION index_partitionPARTITION (partition_key)TABLESPACE (table_space_name);```其中,`index_name` 是索引的名称,`index_partition` 是需要重建的分区,`partition_key` 是分区键,`table_space_name` 是表空间名称。
例如,如果要重建名为`my_index`的分区索引,分区键为`date_column`,表空间为`my_tablespace`,可以使用以下语句:```ALTER INDEX my_indexREBUILD PARTITION my_index_partitionPARTITION (date_column)TABLESPACE my_tablespace;```5.总结在Oracle数据库中,分区索引是一种提高查询性能的有效方法。
索引工作原理
索引是一种数据结构,用于快速查找和访问数据。
它可以帮助提高数据检索的效率,并减少搜索所需的时间和资源。
索引的工作原理如下:
1. 数据结构:索引通常采用B树、B+树或哈希表等数据结构
来组织和存储索引数据。
这些数据结构可以提供快速的插入、删除和搜索操作。
2. 键值对:索引由键和对应的值组成。
键通常是要检索的数据的某个属性或字段,而值则是指向实际数据的指针或地址。
3. 唯一性约束:索引通常是唯一的,即每个键只对应一个值。
这样可以确保数据的唯一性,并避免重复数据的存储和检索。
4. 排序:索引可以按照键的顺序进行排序,以便快速地进行范围搜索和区间查询。
5. 查找:当进行数据检索时,系统首先根据索引对键进行搜索。
索引会存储键的位置信息,从而可以快速地定位到相应的数据存储位置。
6. 数据存储:索引只存储键和指向实际数据的指针,而实际数据则存储在另外的数据结构中,如表格、文件等。
这样可以减少索引的占用空间和更新的成本。
7. 更新和维护:当数据库中的数据发生变化时,索引也需要进行相应的更新和维护。
例如,当插入、删除或修改数据时,索引会相应地进行插入、删除或更新操作,以保持索引与实际数据的一致性。
总之,索引通过使用特定的数据结构和算法,将数据组织和存储起来,以提供快速、高效的数据检索和访问功能。
它是数据库和搜索引擎等系统中重要的组成部分。
Oracle数据库中建⽴索引的基本⽅法讲解怎样建⽴最佳索引?1、明确地创建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0);2、创建基于函数的索引常⽤与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;3、创建位图索引对基数较⼩,且基数相对稳定的列建⽴索引时,⾸先应该考虑位图索引,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name;4、明确地创建唯⼀索引可以⽤create unique index语句来创建唯⼀索引,例:create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;5、创建与约束相关的索引可以⽤using index字句,为与unique和primary key约束相关的索引,例:alter table table_nameadd constraint PK_primary_keyname primary key(field_name)using index tablespace tablespace_name;如何创建局部区索引?1)基础表必须是分区表2)分区数量与基础表相同3)每个索引分区的⼦分区数量与相应的基础表分区相同4)基础表的⾃分区中的⾏的索引项,被存储在该索引的相应的⾃分区中,例如create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage(MaxExtents 32768PctIncrease 0FreeLists 1FreeList Groups 1)local/如何创建范围分区的全局索引?基础表可以是全局表和分区表create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than ('0106')partition p01_idx vlaues less than ('0111')...partition p01_idx vlaues less than ('0401'))/如何重建现存的索引?重建现存的索引的当前时刻不会影响查询重建索引可以删除额外的数据块提⾼索引查询效率alter index idx_name rebuild nologging;对于分区索引alter index idx_name rebuild partition partition_name nologging;删除索引的原因?1)不再需要的索引2)索引没有针对其相关的表所发布的查询提供所期望的性能改善3)应⽤没有⽤该索引来查询数据4)该索引⽆效,必须在重建之前删除该索引5)该索引已经变的太碎了,必须在重建之前删除该索引语句:drop index idx_name;drop index idx_name partition partition_name;建⽴索引的代价?基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,主要表现在CPU和I/O上。
Oracle数据库中的索引详解
一、ROWID的概念
存储了row在数据文件中的具体位置:64位编码的数据,A-Z, a-z, 0-9, +, 和/,row在数据块中的存储方式
SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20;
比如:OOOOOOFFFBBBBBBRRR
OOOOOO:data object number, 对应dba_objects.data_object_id
FFF:file#, 对应v$datafile.file#
BBBBBB:block#
RRR:row#
Dbms_rowid包
SELECT dbms_rowid.rowid_block_number('AAAGFqAABAAAIWEAAA') from dual;
具体到特定的物理文件
二、索引的概念
1、类似书的目录结构
2、Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度
3、索引直接指向包含所查询值的行的位置,减少磁盘I/O
4、与所索引的表是相互独立的物理结构
5、Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引
6、语法:CREA TE INDEX index ON table (column[, column]...);
7、B-tree结构(非bitmap):
[一]了解索引的工作原理:
表:emp
目标:查询Frank的工资salary
建立索引:create index emp_name_idx on emp(name);
[试验]测试索引的作用:
1. 运行/rdbms/admin/utlxplan 脚本
2. 建立测试表
create table t as select * from dba_objects;
insert into t select * from t;
create table indextable
as select rownum id,owner,object_name,subobject_name,
object_id,data_object_id,object_type,created
from t;
3. set autotrace trace explain
4. set timing on
5. 分析表,可以得到cost
6. 查询object_name=’DBA_INDEXES’
7. 在object_name列上建立索引
8. 再查询
[思考]索引的代价:
插入,更新
三、唯一索引
1、何时创建:当某列任意两行的值都不相同
2、当建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立
3、语法:CREA TE UNIQUE INDEX index ON table (column);
4、演示
四、组合索引
1、何时创建:当两个或多个列经常一起出现在where条件中时,则在这些列上同时创建组合索引
2、组合索引中列的顺序是任意的,也无需相邻。
但是建议将最频繁访问的列放在列表的最前面
3、演示(组合列,单独列)
五、位图索引
1、何时创建:
列中有非常多的重复的值时候。
例如某列保存了“性别”信息。
Where 条件中包含了很多OR操作符。
较少的update操作,因为要相应的跟新所有的bitmap
2、结构:位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。
3、优点:位图以一种压缩格式存放,因此占用的磁盘空间比标准索引要小得多
4、语法:CREA TE BITMAP INDEX index ON table (column[, column]...);
5、掩饰:
create table bitmaptable as select * from indextable where owner in('SYS','PUBLIC');
分析,查找,建立索引,查找
六、基于函数的索引
1、何时创建:在WHERE条件语句中包含函数或者表达式时
2、函数包括:算数表达式、PL/SQL函数、程序包函数、SQL函数、用户自定义函数。
3、语法:CREA TE INDEX index ON table (FUNCTION(column));
4、演示
必须要分析表,并且query_rewrite_enabled=TRUE
或者使用提示/*+ INDEX(ic_index)*/
七、反向键索引
目的:比如索引值是一个自动增长的列:
多个用户对集中在少数块上的索引行进行修改,容易引起资源的争用,比如对数据块的等待。
此时建立反向索引。
性能问题:
语法:
重建为标准索引:反之不行
八、键压缩索引
比如表landscp的数据如下:
site feature job
Britten Park, Rose Bed 1, Prune
Britten Park, Rose Bed 1, Mulch
Britten Park, Rose Bed 1,Spray
Britten Park, Shrub Bed 1, Mulch
Britten Park, Shrub Bed 1, Weed
Britten Park, Shrub Bed 1, Hoe
……
查询时,以上3列均在where条件中同时出现,所以建立基于以上3列的组合索引。
但是发现重复值很多,所以考虑压缩特性。
Create index zip_idx
on landscp(site, feature, job)
compress 2;
将索引项分成前缀(prefix)和后缀(postfix)两部分。
前两项被放置到前缀部分。
Prefix 0: Britten Park, Rose Bed 1
Prefix 1: Britten Park, Shrub Bed 1
实际索引的结构为:
0 Prune
0 Mulch
0 Spray
1 Mulch
1 Weed
1 Hoe
特点:组合索引的前缀部分具有非选择性时,考虑使用压缩。
减少I/O,增加性能。
九、索引组织表(IOT)
将表中的数据按照索引的结构存储在索引中,提高查询速度。
牺牲插入更新的性能,换取查询性能。
通常用于数据仓库,提供大量的查询,极少的插入修改工作。
必须指定主键。
插入数据时,会根据主键列进行B树索引排序,写入磁盘。
十、分区索引。