oracle索引

SQL查询--索引

北慕城南 提交于 2019-11-29 01:40:35
索引概念和作用 索引是建立在表上的可选对象,目的是为了提高查询速度。 如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的ROWID快速找到表中对应的记录。 例如,如果将表看做一本书,索引的作用类似于书中的目录。在没有目录的情况下,要在书中查找指定的内容必须阅读全文,而有了目录之后,只需要通过目录就可以快速找到包含所需内容的页码(相当于ROWID) 链接: https://www.jianshu.com/p/ebf56728e087 索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率。 索引在逻辑上和物理上都与相关的表的数据无关,当创建或删除一个索引时,不会影响基本的表、数据库应用或其他索引,当插入、更改和删除相关的表记录时,Oracle会自动管理所引,如果删除索引,所有的应用仍然可以继续工作。因此在表上一列或多列创建索引不会对表的使用产生任何影响,但是,可以提高检索速度。 索引一旦建立后,当在表上进行DML操作时,Oracle会自动维护索引,并决定何时使用索引。 索引的使用对用户是透明的,用户不需要再执行SQL语句时指定使用哪个索引以及如何使用索引。索引只与系统性能相关。 索引原理 索引的类型 可以按照列的多少、索引值是否唯一

SQL 优化经验总结34条

随声附和 提交于 2019-11-29 00:21:11
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 (4) 减少访问数据库的次数: ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等; (5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数 , 可以增加每次数据库访问的检索数据量

oracle的优化-----学习笔记

三世轮回 提交于 2019-11-28 23:00:24
第一章:oracle的优化器 1.优化器:优化器时Oracle数据库中内置的一个核心子系统。 2.分类:oracle数据库中优化器分为RBO和CBO,(Rule-Based-Optimizer) 基于规则的优化器 ,(Cost-Based-Optimizer) 基于成本的优化器 3.RBO等级从低到高分为1~15等级,1的执行效率最高,15等级最低,RBO内置的等级1所对应的执行路径为single row by rowid ,等级15则对应的执行路径为full table scan(全表扫描)。 4.CBO与RBO相比,有明显缺陷,在使用RBO情况下,执行计划一旦出现问题,很难对其做调整,还有就是,SQL的写法,甚至时目标SQL中涉及的各个对象在该SQL文本中的先后顺序,都可能会影响RBO对于该SQL执行计划的选择,还有,oracle数据库中有好多很好的特性,都不被RBO支持。 5.调整RBO,改变执行计划,比如where条件中,对NUMBER或者DATE类型的列加0,varchar2或者char类型加一个空格符,例如'||',如果遇到同等级的SQL时,RBO会根据目标SQL中所涉及的相关对象在数据字典缓存中的缓存顺序和目标SQL中涉及的各个对象在目标SQL文本中出现的先后顺序来综合判断,意味着我们可以通过调整相关对象在数据字典缓存中缓存顺序

SQL无法走索引的情况及解决思路

柔情痞子 提交于 2019-11-28 18:52:11
上次丁俊大师在社群上做了CBO优化器和坑爹案例的分享后,反响不是一般的强烈,但其中也有一部分同学表示太高大上了(我也是这样觉得的),消化起来相当有难度,于是便有了本文。绕开复杂的CBO优化器不说,本文将帮你理清那些因为SQL语句编写规范问题导致没有充分利用索引来大幅提升效率的使用场景。 一、SQL无法走索引的情况及解决思路 因为数据库优化器不够智能,或者一些逻辑原因,导致SQL在比较适合走索引的情况下却无法正确利用索引。这时候,除了给数据库需要的统计信息之外,SQL语句本身还必须要给优化器足够多的额外有效信息,帮助优化器能够选择更好的执行计划。要让优化器正确选择需要的索引,要考虑两点: 如何避免优化器的限制 根据业务数据特点改写SQL语句 说明:这里说的走不了索引,是指走不了正常的RANGE SCAN,非(FAST) FULL INDEX SCAN。 SQL无法走索引常见的有如下8种情况: 统计信息不准确 索引列的值允许为NULL 谓词使用了不等于(<>, !=) LIKE前通配或全通配的查询 索引列使用了函数、数学运算、其它表达式等 使用了隐式类型转换 查询转换失败 其它语句逻辑原因 第一、二种情况在现实中比较常见,解决办法也相对比较简单,下面就不再作详细展开了。 谓词使用了不等于(<>,!=),走不了索引 解决方法: 如果不等条件之外的值不多,而且是确定的

约束和索引的区别

狂风中的少年 提交于 2019-11-28 14:05:29
Constraint 约束被 DB2 Universal Database(DB2 UDB) 用来对数据业务规则和数据完整性进行实施、维护。约束的作用范围仅限在当前数据库,通过检索‘数据库目录’和‘命令方式’(select * from user_constraints)可以查看到约束信息。如果想方便、快捷的访问约束信息,Control Center也是种方式。约束可以被当做 数据库对象 来处理,它们具有名称和关联模式(creator ID)。 约束的五种类型: 一、主键约束(primary key constraint) 主键创建时默认会自生成约束,也可通过显示声明。 alter table stuInfo add constraint PK_stuNo primary key (stuNo) /* 主键可以是一列或多列的组合用以唯一标识表中某行数据。*/ 二、外键约束(foreign key constraint) 外键创建时默认会自生成约束,也可通过显示声明。 alter table stuMarks add constraint FK_stuNo foreign key(stuNo) references stuinfo(stuNo) /* 主表stuInfo 从表stuMarks */ 三、检查约束(check constraint) alter table

SQL性能优化-执行计划

我的梦境 提交于 2019-11-28 05:38:43
SQL性能优化 首先,要理解什么是执行计划 PLSQL可以看执行计划:圆形框起来的 也可以改代码格式:红框 数据库存储结构: 数据块 是oracle 对数据文件进行管理的单位, 数据库中最小的 数据块 是最小的数据单位,是最小的I/O 单位, 数据区: 连续的数据块构成的数据库逻辑存储分配单位 数据区何时被回收: 如果用户为回滚段(rollbacksegment)设定了 OPTIMAL 参数,Oracle将周期性地从其中回收数据扩展。 使用 drop delete 和 truncate,oracle不会回收对应的字段的数据块 数据段: 数据段是数据库对象的对应,一个数据库对象对应一个数据段 通俗的讲 一个表为一个段,如果表分区了,那么一个表分区是一个段 表空间: 由一个或者多个物理文件组成,建表时,将表建在表空间上 SQL性能优化: 1.select * from 避免使用 2.减少数据库的访问次数 3.索引上加函数,会致使索引失效,不要再索引上加函数 4.隐身转换也会导致索引失效 id='3' 5.like '%xx%' 第一个不要 6.IS NULL", " <>", "!=", "!>", "! <", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描 7

oracle创建、删除索引等操作

穿精又带淫゛_ 提交于 2019-11-28 04:59:37
1、创建索引 create index 索引名 on 表名(列名); 2、删除索引 drop index 索引名; 3、创建组合索引 create index 索引名 on 表名(列名1,,列名2); 4、查询索引 --根据索引名,查询表索引字段 select * from user_ind_columns where index_name='索引名'; --根据表名,查询一张表的索引 select * from user_indexes where table_name='表名'; ———————————————— 版权声明:本文为CSDN博主「喜剧新人」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/farxix/article/details/80162437 来源: https://www.cnblogs.com/niudaxianren/p/11392623.html

程序员面试备战篇:18个经典MySQL面试专题解析,干货分享

蓝咒 提交于 2019-11-28 04:21:22
1.数据库三范式是什么? 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分) 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。>所以第三范式具有如下特征:>>1. 每一列只有一个值 >>2. 每一行都能区分。>>3. 每一个表都不包含其他表已经包含的非主关键字信息。 2.有哪些数据库优化方面的经验? 用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等4. UNION ALL 要比UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用 UNIONALL。>>UNION 和

数据库SQL语句性能优化

血红的双手。 提交于 2019-11-28 01:43:12
原文地址: https://www.jiagou1216.com/blog/db/479.html 选择最有效率的表名顺序 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. WHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. SELECT子句中避免使用'*' 当你想在select子句中列出所有的column时,使用动态sql列引用''是一个方便的方法,不幸的是,这是一个非常低效的方法。 实际上,oracle在解析的过程中,会将''依次转换成所有的列名。这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。 字符型字段必须加单引号 字符型字段必须加单引号,避免where查询条件做隐型转换时后出现混乱, select ename,sal,deptno from emp where empno='7782';

Oracle SQL的优化规则解析

被刻印的时光 ゝ 提交于 2019-11-27 13:00:40
以下的文章主要介绍的是Oracle SQL的优化规则的推荐方案,如果你是 Oracle SQL的优化规则实际应用方面的新手,你就可以通过以下的文章对Oracle SQL的优化规则的推荐方案的实际操作有个更好的了解,介绍以下就是文章的详细内容的介绍。 用其它相同功能的操作运算代替,如: 1)a is not null 改为 a>0 或a>’’等。 2)不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。 3) 建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象) 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用 对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。 如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。 Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。 对数据类型不同的列进行比较时,会使索引失效。 > 及 < 操作符(大于或小于操作符) 大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行Oracle SQL优化,如一个表有100万记录,一个数值型字段A, 30万记录的A=0,30万记录的A=1