oracle index学习总结

合集下载

Oracle索引(Index)介绍使用

Oracle索引(Index)介绍使用

Oracle索引(Index)介绍使⽤1.什么是引 索引是建⽴在表的⼀列或多个列上的辅助对象,⽬的是加快访问表中的数据;Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶⼦节点不同B*数索引;索引由根节点、分⽀节点和叶⼦节点组成,上级索引块包含下级索引块的索引数据,叶节点包含索引数据和确定⾏实际位置的rowid。

2.使⽤索引的⽬的 当查询返回的记录数排序表<40%⾮排序表 <7%且表的碎⽚较多(频繁增加、删除)时可以加快查询速度减少I/O操作消除磁盘排序3.索引的分类及结构 从物理上说,索引通常可以分为:分区和⾮分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。

其中,B树索引属于最常见的索引,由于我们的这篇⽂章主要就是对B树索引所做的探讨,因此下⾯只要说到索引,都是指B树索引。

B树索引是⼀个典型的树结构,其包含的组件主要是:1) 叶⼦节点(Leaf node):包含条⽬直接指向表⾥的数据⾏。

2) 分⽀节点(Branch node):包含的条⽬指向索引⾥其他的分⽀节点或者是叶⼦节点。

3) 根节点(Root node):⼀个B树索引只有⼀个根节点,它实际就是位于树的最顶端的分⽀节点。

可以⽤下图⼀来描述B树索引的结构。

其中,B表⽰分⽀节点,⽽L表⽰叶⼦节点。

对于分⽀节点块(包括根节点块)来说,其所包含的索引条⽬都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。

每个索引条⽬(也可以叫做每条记录)都具有两个字段。

第⼀个字段表⽰当前该分⽀节点块下⾯所链接的索引块中所包含的最⼩键值;第⼆个字段为四个字节,表⽰所链接的索引块的地址,该地址指向下⾯⼀个索引块。

在⼀个分⽀节点块中所能容纳的记录⾏数由数据块⼤⼩以及索引键值的长度决定。

⽐如从上图⼀可以看到,对于根节点块来说,包含三条记录,分别为(0 B1)、(500 B2)、(1000B3),它们指向三个分⽀节点块。

Oracle数据库学习_唯一性索引(UniqueIndex)与普通索引(NormalIndex)

Oracle数据库学习_唯一性索引(UniqueIndex)与普通索引(NormalIndex)

Oracle数据库学习_唯⼀性索引(UniqueIndex)与普通索引
(NormalIndex)
唯⼀性索引(Unique Index)与普通索引(Normal Index)最⼤的差异就是在索引列上增加了⼀层唯⼀约束。

添加唯⼀性索引的数据列可以为空,但是只要存在数据值,就必须是唯⼀的。

这样做的好处,⼀是让索引更有效率;⼆是避免重复数据的出现。

实际上,在许多场合,⼈们创建唯⼀索引的⽬的往往不是为了提⾼访问速度,⽽只是为了避免数据出现重复。

创建语句如下:
create unique index 索引名 on 表名(列名1, 列名2, ...);
普通索引允许被索引的数据列包含重复的值。

创建语句如下:
create index 索引名 on 表名(列名1, 列名2, ...);。

oracle索引总结

oracle索引总结

oracle 索引总结oracle 索引总结简介1.说明 1)索引是数据库对象之⼀,⽤于加快数据的检索,类似于书籍的索引。

在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利⽤索引可以不⽤翻阅整本书即可找到想要的信息。

2)索引是建⽴在表上的可选对象;索引的关键在于通过⼀组排序后的索引键来取代默认的全表扫描检索⽅式,从⽽提⾼检索效率 3)索引在逻辑上和物理上都与相关的表和数据⽆关,当创建或者删除⼀个索引时,不会影响基本的表; 4)索引⼀旦建⽴,在表上进⾏DML 操作时(例如在执⾏插⼊、修改或者删除相关操作时),oracle 会⾃动管理索引,索引删除,不会对表产⽣影响 5)索引对⽤户是透明的,⽆论表上是否有索引,sql 语句的⽤法不变 6)oracle 创建主键时会⾃动在该列上创建索引索引原理1. 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有⼀个wish ,必须全部搜索⼀遍2. 若在name 上建⽴索引,oracle 会对全表进⾏⼀次搜索,将每条记录的name 值哪找升序排列,然后构建索引条⽬(name 和rowid ),存储到索引段中,查询name 为wish 时即可直接查找对应地⽅3.创建了索引并不⼀定就会使⽤,oracle ⾃动统计表的信息后,决定是否使⽤索引,表中数据很少时使⽤全表扫描速度已经很快,没有必要使⽤索引索引使⽤(创建、修改、删除、查看)1.创建索引语法CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique 表⽰唯⼀索引ON table_name([column1 [ASC|DESC],column2 --bitmap ,创建位图索引[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1] --指定索引在数据块中空闲空间[STORAGE (INITIAL n2)][NOLOGGING] --表⽰创建和重建索引时允许对表做DML 操作,默认情况下不应该使⽤[NOLINE][NOSORT]; --表⽰创建索引时不进⾏排序,默认不适⽤,如果数据已经是按照该索引顺序排列的可以使⽤2.修改索引1)重命名索引alter index index_sno rename to bitmap_index;2) 合并索引(表使⽤⼀段时间后在索引中会产⽣碎⽚,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引⽅式更好些,⽆需额外存储空间,代价较低)alter index index_sno coalesce ;3)重建索引 ⽅式⼀:删除原来的索引,重新建⽴索引 ⽅式⼆:alter index index_sno rebuild;3.删除索引drop index index_sno;4.查看索引select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';-- eg:create index index_sno on student('name');select*from all_indexes where table_name='student';索引分类1. B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值)1)说明: 1.oracle中最常⽤的索引;B树索引就是⼀颗⼆叉树;叶⼦节点(双向链表)包含索引列和指向表中每个匹配⾏的ROWID值 2.所有叶⼦节点具有相同的深度,因⽽不管查询条件怎样,查询速度基本相同 3.能够适应精确查询、模糊查询和⽐较查询2)分类: UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)3)创建例⼦craete index index_sno on student('sno');4)适合使⽤场景: 列基数(列不重复值的个数)⼤时适合使⽤B数索引2. 位图索引1)说明: 1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建⽴⼀个位图(位图中,对表中每⼀⾏使⽤⼀位(bit,0或者1)来标识该⾏是否包含该位图的索引列的取值,如果为1,表⽰对应的rowid所在的记录包含该位图索引列值),最后通过位图索引中的映射函数完成位到⾏的ROWID的转换2)创建例⼦create bitmap index index_sno on student(sno);3) 适合场景:对于基数⼩的列适合简历位图索引(例如性别等)3.单列索引和复合索引(基于多个列创建)1) 注意: 即如果索引建⽴在多个列上,只有它的第⼀个列被where⼦句引⽤时,优化器才会使⽤该索引,即⾄少要包含组合索引的第⼀列4. 函数索引1)说明: 1. 当经常要访问⼀些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度 2. 函数索引既可以使⽤B数索引,也可以使⽤位图索引;当函数结果不确定时采⽤B树索引,结果是固定的某⼏个值时使⽤位图索引 3. 函数索引中可以⽔泥⽤len、trim、substr、upper(每⾏返回独⽴结果),不能使⽤如sum、max、min、avg等2)例⼦:create index fbi on student (upper(name));select*from student where upper(name) ='WISH';索引建⽴原则总结 1. 如果有两个或者以上的索引,其中有⼀个唯⼀性索引,⽽其他是⾮唯⼀,这种情况下oracle将使⽤唯⼀性索引⽽完全忽略⾮唯⼀性索引 2. ⾄少要包含组合索引的第⼀列(即如果索引建⽴在多个列上,只有它的第⼀个列被where⼦句引⽤时,优化器才会使⽤该索引) 3. ⼩表不要简历索引 4. 对于基数⼤的列适合建⽴B树索引,对于基数⼩的列适合简历位图索引 5. 列中有很多空值,但经常查询该列上⾮空记录时应该建⽴索引 6. 经常进⾏连接查询的列应该创建索引 7. 使⽤create index时要将最常查询的列放在最前⾯ 8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长⼆进制数据,最长2G)列不能创建索引 9.限制表中索引的数量(创建索引耗费时间,并且随数据量的增⼤⽽增⼤;索引会占⽤物理空间;当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)注意事项1. 通配符在搜索词⾸出现时,oracle不能使⽤索引,eg:--我们在name上创建索引;create index index_name on student('name');--下⾯的⽅式oracle不适⽤name索引select*from student where name like'%wish%';--如果通配符出现在字符串的其他位置时,优化器能够利⽤索引;如下:select*from student where name like'wish%';2. 不要在索引列上使⽤not,可以采⽤其他⽅式代替如下:(oracle碰到not会停⽌使⽤索引,⽽采⽤全表扫描)select*from student where not (score=100);select*from student where score <>100;--替换为select*from student where score>100or score <1003. 索引上使⽤空值⽐较将停⽌使⽤索引, eg:select*from student where score is not null;。

Oracle索引用法大总结,好处与坏处,优点与缺

Oracle索引用法大总结,好处与坏处,优点与缺

Oracle索引⽤法⼤总结,好处与坏处,优点与缺Oracle索引⽤法⼤总结,好处与坏处,优点与缺点⼆索引使⽤的好处与坏处(Oracle)分类:OracleDB创建索引的好处–帮助⽤户提⾼查询速度–利⽤索引的唯⼀性来控制记录的唯⼀性–可以加速表与表之间的连接–降低查询中分组和排序的时间创建索引的坏处–存储索引占⽤磁盘空间–执⾏数据修改操作(INSERT、UPDATE、DELETE)产⽣索引维护----------------------------------------------------------------------------------------------索引是提⾼数据查询最有效的⽅法,也是最难全⾯掌握的技术,因为正确的索引可能使效率提⾼10000倍,⽽⽆效的索引可能是浪费了数据库空间,甚⾄⼤⼤降低查询性能。

索引的管理成本1、存储索引的磁盘空间2、执⾏数据修改操作(INSERT、UPDATE、DELETE)产⽣的索引维护3、在数据处理时回需额外的回退空间。

实际数据修改测试:⼀个表有字段A、B、C,同时进⾏插⼊10000⾏记录测试在没有建索引时平均完成时间是2.9秒在对A字段建索引后平均完成时间是6.7秒在对A字段和B字段建索引后平均完成时间是10.3秒在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒从以上测试结果可以明显看出索引对数据修改产⽣的影响索引按存储⽅法分类B*树索引B*树索引是最常⽤的索引,其存储结构类似书的索引结构,有分⽀和叶两种类型的存储数据块,分⽀块相当于书的⼤⽬录,叶块相当于索引到的具体的书页。

⼀般索引及唯⼀约束索引都使⽤B*树索引。

位图索引位图索引储存主要⽤来节省空间,减少ORACLE对数据块的访问,它采⽤位图偏移⽅式来与表的⾏ID号对应,采⽤位图索引⼀般是重复值太多的表字段。

位图索引在实际密集型OLTP(数据事务处理)中⽤得⽐较少,因为OLTP会对表进⾏⼤量的删除、修改、新建操作,ORACLE每次进⾏操作都会对要操作的数据块加锁,所以多⼈操作很容易产⽣数据块锁等待甚⾄死锁现象。

oracle常用索引分析,使用原则和注意事项

oracle常用索引分析,使用原则和注意事项

oracle常⽤索引分析,使⽤原则和注意事项本⽂参考:索引简介• 索引(index)是数据库对象的⼀种。

索引的关键在于通过⼀组排序后的物理地址作为键来取代默认的全表扫描检索⽅式,就像为书本添加⽬录,通过牺牲物理内存的⽅式提⾼数据的检索效率。

• 它对⽤户时透明的,它的创建不会影响对表的sql操作。

索引⼀旦建⽴,在表上进⾏DML操作时(例如在执⾏插⼊、修改或者删除相关操作时),oracle会⾃动管理索引。

• oracle创建主键时会⾃动创建索引添加索引1.创建默认索引CREATE UNIQUE INDEX (索引名称) ON 表名 (列名1,列名2...) ; --unique(默认)表⽰唯⼀索引2.修改索引alter index (旧索引名称) rename to(新索引名称);3.删除索引drop index (索引名称);4.查看索引查看某表的所有索引:select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name =(表名);常⽤的2种索引及适⽤场景1.b树索引(默认索引,保存排序过的索引列和对应的rowid值)b树索引是oracle最常见的的索引,它的原理是利⽤了b-树的数据结构(b树的原理:)b树索引结构图:b树的所有叶⼦节点拥有相同的深度,oracle将索引列和对应的rowid值存⼊叶⼦节点上,因此所有的检索速度基本都是相同的。

b树索引的不适⽤场景:不适合键值较少的列(重复数据较多的列)假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。

再加上访问索引块,⼀共要访问⼤于200个的数据块。

如果全表扫描,假设10条数据⼀个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块少⼀点,肯定不会利⽤b树索引了。

ORACLE数据库学习心得1

ORACLE数据库学习心得1

ORACLE数据库结课论文一个好的程序, 必然联系着一个庞大的数据库网路...今年我们学习了oracle数据库这门课程, 起初的我, 对这个字眼是要多陌生有多陌生, 后来上课的时候听一会老师讲课, 偶尔再跟上上机课, 渐渐的学会了不少东西, 但我感觉, 我学到的仍是一些皮毛而已, 怀着疑惑和求知的心态, 我在网上搜索了关于oracle数据库的一些知识。

1.ORACLE的特点:可移植性ORACLE采用C语言开发而成, 故产品与硬件和操作系统具有很强的独立性。

从大型机到微机上都可运行ORACLE的产品。

可在UNIX、DOS、Windows等操作系统上运行。

可兼容性由于采用了国际标准的数据查询语言SQL, 与IBM的SQL/DS、DB2等均兼容。

并提供读取其它数据库文件的间接方法。

可联结性对于不同通信协议, 不同机型与不同操作系统组成的网络也可以运行ORAˉCLE数据库产品。

2.ORACLE的总体结构(1)ORACLE的文件结构一个ORACLE数据库系统包括以下5类文件:ORACLE RDBMS的代码文件。

数据文件一个数据库可有一个或多个数据文件, 每个数据文件可以存有一个或多个表、视图、索引等信息。

日志文件须有两个或两个以上, 用来记录所有数据库的变化, 用于数据库的恢复。

控制文件可以有备份, 采用多个备份控制文件是为了防止控制文件的损坏。

参数文件含有数据库例程起时所需的配置参数。

(2)ORACLE的内存结构一个ORACLE例程拥有一个系统全程区(SGA)和一组程序全程区(PGA)。

SGA(System Global Area)包括数据库缓冲区、日志缓冲区与共享区域。

PGA(Program Global Area)是每一个Server进程有一个。

一个Server进程起动时, 就为其分配一个PGA区, 以存放数据与控制信息。

(3)ORACLE的进程结构ORACLE包括三类进程:①用户进程用来执行用户应用程序的。

Oracle数据库知识点总结

Oracle数据库知识点总结

Oracle数据库知识点总结第一篇:Oracle数据库知识点总结1.constraint约束:alter table [table_name] add constraint [pk_name] primary key(pkname);//添加主键alter table [table_name] drop constraint [pk_name];//删除主键alter table [table_name] add constraint [fk_name] foreign key(fkname)references [tablename](fkname);//添加外键alter table [table_name] drop constraint [fk_name];//删除外键2.union 关键字:A username,B usernamerodbrucerosemarinaselect username from Aunionselect username from B2、几个高级查询运算词A: UNION 运算符UNION 运算符通过组合其他两个结果表(例如TABLE1 和TABLE2)并消去表中任何重复行而派生出一个结果表。

当ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。

两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

B: EXCEPT 运算符EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。

当 ALL 随EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。

C: INTERSECT 运算符INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。

当 ALL 随INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。

oracle 索引使用技巧

oracle 索引使用技巧

oracle 索引使用技巧(原创实用版3篇)《oracle 索引使用技巧》篇1Oracle 索引是一种提高查询效率的数据库对象,它可以为表中的字段添加快速访问的结构。

以下是一些Oracle 索引使用技巧:1. 根据实际需要创建索引:在创建索引之前,需要仔细分析查询操作和数据的访问模式,只为那些经常作为查询条件的字段添加索引。

同时,也需要考虑索引的维护成本和空间占用。

2. 使用适当的索引类型:Oracle 支持多种不同类型的索引,如B 树索引、位图索引、反向键索引等,每种索引都有其适用的场景。

根据实际需求选择合适的索引类型,可以最大化地提高查询效率。

3. 合理设置索引参数:在创建索引时,需要设置一些参数,如索引类型、索引名、字段名、索引空间大小等。

这些参数的设置会影响索引的性能和维护成本,需要根据实际情况进行合理设置。

4. 使用函数索引:如果查询中涉及到函数操作,可以考虑创建函数索引。

函数索引可以优化函数查询的效率,减少查询时间和资源占用。

5. 维护索引:索引需要定期维护,以确保其有效性和正确性。

可以使用Oracle 提供的工具来维护索引,如DBMS_INDEX.REBUILD 和DBMS_INDEX.COALESCE。

6. 合理使用索引:在使用索引时,需要注意一些技巧,如避免在索引列上使用函数、避免使用不必要的索引、合理设置索引访问权限等。

《oracle 索引使用技巧》篇2Oracle 索引是一种提高查询效率的数据库对象,可以通过创建索引来优化查询性能。

以下是一些Oracle 索引使用技巧:1. 根据实际需要创建索引:在创建索引之前,需要仔细分析查询情况和数据的访问模式,只为那些经常作为查询条件的字段添加索引。

同时,也需要考虑索引的维护成本,避免创建过多的索引。

2. 选择合适的索引类型:Oracle 支持多种类型的索引,如B 树索引、位图索引、反向键索引等,每种类型的索引都有其适用的场景。

根据实际需要选择合适的索引类型,可以提高查询效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

oracle index
1.index需要储存空间和I/O操作。

2.index的目的是加快select的速度的。

3.insert,update,delete数据oracle会同时对索引进行相应的调整,因此会增加一定的消耗。

4.使用index一定能加快select速度吗?不是的,数据少和巨大时index会影响select的速度,因此如果查询速度可以满足,就不要建index。

5.Index 对null 无效。

分类:
一、从物理角度
1. partitioned or nonpartitioned : 分区或不分区索引。

分区索引用于分区表。

2.B-tree(平衡树) : normal or reverse key 正常和倒序索引。

oracle默认索引方式,平衡树形索引,在叶子节点上有双向链表,加快索引定位速度,oracle有一定的优化,可以根据链表直接定位记录,而不走树,综合使用提高速度。

见图1和图2。

图1
图2
3.bitmap(位图) :用二进制的0、1来构建索引,在进行or操作时非常快, 但要注意bitmap 对于并发操作时,改一条会锁了很多记录,因为所有的记录在一个索引条目上,所以修改或增加时会一起锁定,见图3.
图3
区别和使用场景
二、逻辑角度:
1.single column or concatenated单索引和组合索引。

2.unique or nonunique: 唯一索引和非唯一索引。

3.function-based: 基于函数的索引,把一些where条件作为函数。

4.domain:数据库以外的索引,如文件等。

三、创建index时的注意事项:
1.balance query and DML needs: 索引的目的是为了提高查询速度,但它会加重DML的负担。

2.place in separate tablespace: 索引和表应该放在不同的表空间,如果把索引和表放在同一个空间,会引起竞争,因为在读取一个表时,记录和索引是同时读取,修改也同步进行的。

e uniform extent sizes:Multipes of five blocks or minimum extent size for tablespace. 索引空间是extent是大小应该是5 blocks的倍数,因为oracle是一次读出5个blocks,如果你的extends是6,就会造成2次I/O操作。

4. consider nologging for large indexes:在创建索引时可以关闭索引对应的redo 日志,提高速度,因为索引和数据不同,如果索引创建时出意外,数据还在,就再创建一次好了。

5.INITRANS should generally be higher on indexes than on the corresponding tables:INITRANS 参数比对应的表的值大些,因为索引也是已表记录的方式保存的,但索引大大小于表的记录,所以一个block中存储的索引记录就大大多于表在一个block中的记录,加大INITRANS可以增加在一个block中的事务的并发数,就提高了效率。

6.rebuilding indexes:如果删除一条记录,对应的索引仅仅是做了逻辑删除,只有一个block 中的全部索引都被标识为逻辑删除,orcle才会真正的回收block, 这时这个block才能被再次利用,在表的记录做update时,index是先做了逻辑删除,然后再为该记录新建一个索引的,所以表在频繁的增删改后,就会造成index对应的block不完整,和系统碎片的情况是一致的,造成空间浪费,加大index的I/O,影响性能。

而rebuilding indexes就可以回收原来的,重新构建一个高效的索引,但重构时会锁表。

语法:alter index index_name rebuild;
7.coalescing indexes: 整理索引碎片,效率高,不锁表。

语法:Alter index index_name coalesce;
四.管理索引
1.分析索引:
1) select * from user_objects where object_type='INDEX'
2)analyze index PK_T_TICKET validate structure;
3)select * from index_stats;
当DEL_LF_ROWS/ LF_ROWS>15%时应进行索引重建或索引碎片整理。

2.drop 索引:当屁量导入大量数据时,索引会影响导入速度。

可以现在drop掉,导入后再重建索引。

3.监控索引:
1)设置监控那个索引 alter index pk_t_ticket monitoring usage;
2)查看该索引用没有使用select * from v$object_usage
3)select count(1) from pk_t_ticket;
4) 查看该索引用没有使用select * from v$object_usage
5)关闭监控alter index pk_t_ticket nomonitoring usage;
监控一个月就大概可以知道那些是无用的索引了。

6)查询索引的详细信息: select * from all_ind_columns where index_name='PK_T_TICKET' .那个表的那个列上有索引及详细信息。

相关文档
最新文档