- 浏览: 92918 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (139)
- oracle基础 (27)
- oracle sql编程及优化 (14)
- ELK (4)
- java (11)
- java设计模式 (0)
- 互联网知识 (6)
- 安装MongoDB (1)
- MongoDB (0)
- spark (1)
- scala (1)
- spring boot (3)
- spring cloud (8)
- redis (6)
- virtualbox (3)
- docker (7)
- rabbitmq (0)
- rocketmq (2)
- k8s (8)
- ubuntu (11)
- centos (3)
- mysql (4)
- nginx (7)
- tomcat (5)
- postman (1)
- other (10)
最新评论
-
lihao312:
insert all功能好强大哦 之前都没有用到过
oracle 多表插入 insert all 用法(即列转行)
索引广义上可以分为3类:B-树索引、位图索引以及索引组织表。
B-树索引在各类应用中得到了广泛的使用。有很多种索引类型如分区索引、压缩索引、基于函数的索引都实现为B-索引。特殊的索引类型,如索引组织表以及索引组织表上的次级索引同样也实现B-树索引。
位图索引的实现适用于不经常进行更新、插入和删除的列。它们更适合于具有较少唯一值的静态列。一个典型的例子就是在数据仓库应用中。在一张包含人口统计信息的表中的性别列是一个很好的例子,因为对于这一列只有很少的唯一值。
全表扫描访问路径就一定是不好的吗?不一定。一种访问路径的效率对于不同的SQL语句构造、应用数据、数据的分布以及环境都是不同的。没有一种访问路径适用于所有的执行计划。在某些情况下,全表扫描访问路径要好过基于索引的访问。全表扫描和快速全扫描进行多块读取调用,而索引范围扫描或索引唯一扫描进行单块读取。多块读取的效率要比逐块进行的单块读取高很多。优化器的计算将这一区别也考虑了进去,从而能够恰当地选用基于索引的访问路径或全表访问路径。一般来说,OLTP应用将会主要使用基于索引的扫描路径而数据仓库将主要用全表扫描。最后要考虑的一点是并行,如果查询的谓语选择性并不是特别强,就可以使用并行来对查询进行调优,使其执行更快。一个使用并行全表扫描的执行计划的成本可能比串行索引范围扫描在本更低,从而优化器会选择更优的并行执行计划。
选择进行索引的最佳列对于提高SQL访问性是非常关键的。对于索引列的选择应该与SQL语句中使用的谓语相匹配,下面是选择最优索引列时需要考虑的内容:
1.如果应用代码访问某张表的时候,在某一列上使用等式或范围谓语,考虑对这一列进行索引就是一个很好的策略。对于多列索引,引导列应该是在大多数谓语中被使用。
2.考虑谓语的基数以及列的选择度也是很重要的。例如,如果某个列只有两个唯一值并且是均匀分布的,那么这一列可能就不适合建立B-树索引,因为在这一列上使用等式谓语将会获取50%的数据行。另一方面,如果这个列有两个唯一值但不是均匀分布的,也就是说一个值仅在很少的数据行中出现且应用使用这个不常出现的列值来访问表,这种情况下就最好在这一列上建立索引。例如,TEST表processed列具有3个唯一值(P、N、E)。应通过谓语processed='N'来访问这张表,在processed列中仅有几行状态为'N'的未处理数据,因此通过索引来访问是最优的。但谓语为processed='Y'的查询就不应该使用索引,因为使用这个谓语几乎所有行都将被取出。可以使用直方图信息来使用优化器可以根据使用的是常量或绑定变量来选择最优执行计划。
3.考虑列的排序,并安排好索引中列值的顺序以使其与应用访问模式相适应。例如,SALES表,PROD_ID列的选择度为1/72,而CUST_ID列的选择度为1/7059.看上去似乎CUST_ID列是进行索引更好的候选,因为该列的选择度较低。但是,如果应用声明了PROD_ID列上的等式谓语,而没有在谓语中声明CUST_ID列,那么CUST_ID列就不必进行索引,即使CUST_ID列具有更好的选择度。如果应用在PROD_ID和CUST_ID列都应用了谓语,那么最好在这两列上都建立索引并将CUST_ID列作为引导列。需要考虑的是列,是否在谓语中使用,而不是完全依赖于列的选择度。
4.你还需要考虑索引的成本。插入、删除以及更新都需要维护索引,意味着如果在SALES表插入了一行,那么就需要在索引中加入一对与这一行数据相匹配的新值。如果索引列需要进行大量更新的话,这个索引的维护成本就更高。
5.考虑列的长度。建有索引的列越长,索引也就越大。索引的成本可能会超过由索引带来的全部好处。较大的索引尺寸会增加UNDO和REDO区的大小。
6.在多列索引中,如果引导列只有很少的唯一值,考虑将该索引建立为压缩索引。这些索引的尺寸会变得更小,因为压缩索引中不保存重复值。
7.如果谓语在索引列上使用函数,这一列上的索引就不会被选用。例如,谓语TO_CHAR(PROD_ID) = :B1 ,需要建立索引函数
8.不要在需要大幅修改的列上建立位图索引。位图索引的内部实现更适合于只有很少唯一值的只读列。如果索引进行了更新,位图索引的大小可能会迅速增大。对一个位图索引的过多修改,还可能会导致大量的锁资源争夺。位图索引在数据仓库中使用更普遍。
9.在SQL语句中经常会声明IS NULL谓语,空值不存储在某个单独列的索引中,因此谓语IS NULL将不会使用索引。但空值是存储在多列索引中。通过使用另一个虚拟列来创建多列索引,就可以在IS NULL子句中启用索引。具体如下:
create table t1(n1 number ,n2 varchar2(100)); insert into t1 select object_id,object_name from all_objects where rownum < 101; select * from t1; create index t1_n1 on t1(n1); select * from t1 where n1 is null;
重新建立索引: create index t1_n10 on t1(n1,0); select * from t1 where n1 is null;
- B-树索引
B-树索引实现类似于倒置的树型结构,包括根节点、分枝节点和叶子节点,并且使用树遍历算法来搜索列值。叶子节点中包含一对(值,ROWID)值,值对应于索引键列,ROWID则表示行在数据块中的物理位置。分支节点包含叶子节点目录以及存储在其中的叶子节点的值范围。根节点包含分支节点目录以及这些分支节点所包括的值范围。B-树索引适合于具有较低选择度的列,如果列的选择度不够低,索引扫描就会较慢。并且,选择度不够的列将会从叶子块中取出大量的ROWID,从而导致对表进行过多的单块访问。
- 位图索引
位图索引的组织结构和实现方式与B-树索引不同,使用位图来表示列值的行编号。位图索引不适合需要大量更新的列或具有较多DML操作的表。位图索适合于数据仓库。
create bitmap index t1_n1_bitmap on t1(n1) local;
- 索引组织表
常规的数据表都是按照堆表的形式来组织的,因为表数据行能够存储在任何表数据块中。使用主键从常规的数据表中获取一行将会进行主键索引遍历,然后使用行编号来进行表数据块访问。在索引组织表(index organized tables,IOTs)中,表本身被组织为一个索引,所有列存储在索引树自身中,使用主键来访问数据行将只会包含索引访问。这种使用IOT进行访问的方法更好,因为所有列都可以通过访问索引结构来获取,从而避免了表访问。这是一种高效的访问模式,因为实现了访问次数的最小化。在常规表中,每一行都有一个行编号,一旦在表中建立了一行数据,它们就不再移动(可能会有行链接或行迁移,但行的头部不会移动)。不同的是,IOT数据行存储在索引结构自身中。因此,数据行可能由DML运算而迁移到不同的叶子块中,从而引起索引叶子块结构的分裂与合并。简单来说,IOT中的数据行没有物理行编号,而位于堆表中的数据行都会有一个固定的行编号。
IOT适合于具有下面特点的表:
1.数据行长度较短的表。 数据列较少并且很短的表适合于IOT。如果数据行长度更长,索引结构就会过大,导致比堆表使用更多的资源。
2.大多使用主键列进行访问的表 。尽管可以在IOT上建立次级索引,如果主键列较长则次级索引也可能会耗占大量资源。
create table t2(n1 number ,n2 varchar2(100),primary key (n1)) organization index; insert into t2 select object_id,object_name from all_objects where rownum < 101; select * from t2;
索引组织表是一种能够有效减少数据行较短且需要进行大量DML和SELECT活动的表中额外索引的特殊结构。但如果IOT的主键列较长,在其中加入次级索引可能会增大索引大小、UNDO、REDO区的大小。
发表评论
文章已被作者锁定,不允许评论。
-
oracle instr substr结合截取字符串
2014-10-11 11:44 0select substr(email, ... -
oracle is null 优化
2014-05-25 22:17 1276select * from emp where sys_op ... -
Oracle like 优化
2014-05-25 21:02 11011。尽量不要使用 like '%%' 2。对于 like ... -
SQL语句去掉重复数据
2014-03-17 16:07 641有的时候会有部分字段重复,比如ID值不一样,但EMAIL一样 ... -
in和or的性能区别
2012-11-23 16:29 0or会走索引 -
关于计划的稳定性与控制
2012-11-09 17:11 635oracle的基于成本的优化器(CBO)最令人郁闷 ... -
Oracle表与索引的分析及索引重建
2012-11-05 15:22 0转载:Oracle表与索引的分析及索引重建 ... -
ORACLE直方图学习笔记
2012-11-05 14:43 555引用:ORACLE直方图学习笔记 关于直方图的 ... -
oracle 索引介绍(二)
2012-11-05 11:31 646索引也可以像 ... -
analyze和dbms_stats函数的区别
2012-10-31 18:08 687analyze和dbms_stats函数都是收集一些统计信息, ... -
oracle 执行计划
2012-10-31 18:08 691解释计划 语句EXPLAI ... -
oracle表联结方法
2012-10-29 16:22 665联结的方法有:嵌套循环联结、散列联结、排序-合并联结 ... -
oracle数据访问途径之索引扫描
2012-10-29 16:22 685oracle总共只有两种基本 ... -
oracle数据访问途径之全扫描
2012-10-29 16:22 623oracle总共只有两种基本 ... -
autotrace 命令
2012-10-24 10:06 680在SQL*Plus中,你可以通过设置autotrace ... -
聚簇因子笔记
2012-10-24 10:05 5761、聚簇因子(Clustering f ...
相关推荐
Oracle 索引与分区索引介绍 Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建...
Oracle数据库中的索引是优化查询性能的关键工具,它允许快速定位和访问数据。常见的索引类型包括B*树索引和位图索引,每种都有其特定的应用场景和优势。 1. **B*树索引**:这是最常见的索引类型,类似于二叉树结构...
### Oracle索引优化相关知识点详解 #### 一、基本索引概念 在Oracle数据库中,索引是提高数据检索速度的重要工具。通过查询`DBA_INDEXES`视图,可以获取到当前数据库中所有表的所有索引信息。需要注意的是,如果...
总的来说,Oracle索引机制的深入理解对于数据库性能调优、查询优化和系统设计都具有重要意义。正确使用索引可以显著提高查询速度,降低响应时间,提升用户体验,但同时也需要平衡索引对写操作的影响,以确保系统的...
Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程
Oracle 索引是数据库管理系统中提升数据查询速度的关键组件,尤其在大型企业级应用中,选择合适的索引类型对于数据库性能至关重要。本篇文章将深入探讨Oracle中的B*Tree索引、反向索引、降序索引、位图索引和函数...
总的来说,Oracle索引详解及SQL优化是一个深度广度兼具的主题,需要结合实际数据库结构和业务需求,灵活应用各种索引类型和优化策略,以实现数据库性能的最大化。通过深入学习和实践,你可以更好地驾驭Oracle数据库...
Oracle数据库是世界上最广泛使用的数据库管理系统之一,其在数据管理和性能优化方面有着强大的功能。本笔记主要探讨了两个关键概念:约束和索引,这些都是Oracle数据库中的基础但至关重要的元素。 **1. 约束...
Oracle索引是关系数据库管理系统中用于提高查询效率的一种机制,但是索引的使用也存在一些限制。本文将详细介绍一些常见的限制情况,帮助开发人员更好地使用索引,提高查询效率。 限制1:使用不等于操作符 在SQL...
总的来说,理解Oracle索引的工作原理并适当使用,是实现数据库高效运行的关键。正确选择和设计索引,避免使用限制索引的因素,能显著提高查询性能,减少数据库响应时间,从而提升整个系统的性能。在实践中,需要结合...
"数据库创建索引SQL Oracle" 数据库索引是数据库性能优化的重要手段之一。创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。本文将详细介绍数据库创建索引的原则、分类、创建方法、管理和优化等方面...
oracle的索引,非常适合初学者,介绍索引的分类,如何创建,修改等
**Oracle索引详解** Oracle索引是数据库管理系统中用于提高查询效率的重要数据结构。它的工作原理类似于书籍的目录,允许数据库系统快速定位到所需的数据行,而无需扫描整个表。索引的存在使得对大量数据的查找、...
Oracle全文索引是一种特殊类型的索引,它主要用于提高基于文本的查询性能。自从Oracle 7.3版本开始引入了这一特性,允许用户通过Oracle服务器提供的上下文(ConText)选项来执行基于文本的数据查询。随着版本的迭代...
oracle 索引的原理原理深入理解!
### Oracle索引类型详解 #### 一、B\*Tree索引:数据检索的基石 在Oracle数据库中,B\*Tree索引是最常见的索引结构,也是默认创建的索引类型。它基于二叉树原理,由分支块(branch block)和叶块(leaf block)构成,...
Oracle数据库是世界上最广泛使用的数据库系统之一,其性能优化的一个关键因素就是索引的使用。索引可以帮助快速查找和访问数据库中的数据,显著提高查询效率。本篇将详细讲解Oracle数据库中的索引及其重要性。 一、...
下面我们将详细介绍在线创建索引和重组索引的步骤和注意事项。 一、在线创建索引 在线创建索引可以提高查询性能,但是需要评估该索引的必要性和可能对现有语句的影响。如果不是紧急的大索引,最好在维护时间操作。...