oracle索引

MYSQL优化

ぃ、小莉子 提交于 2020-01-12 17:02:42
优化目标 减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。 降低 CPU 计算 除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标 优化方法 改变 SQL 执行计划 明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标 常见误区 count(1)和count(primary_key) 优于 count(*) 很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差,应为数据库对 count(*)

Oracle 数据库中enq:TX-index contention等待时间浅析 侵删

。_饼干妹妹 提交于 2020-01-11 22:43:53
前言: 该文来自于Oracle RWP团队的领袖Andrew Holdsworth的一个精彩分享,笔者觉得很精彩,便将其梳理成文,并加上了自己的理解,希望能帮助大家更好的理解TX-index contention等待事件。 enq:TX-index contention: enq:TX-index contention是一个非常常见的等待事件,其专指由于索引分裂产生的竞争等待。最常见的索引竞争一般发生在主键索引上,主键值从序列(sequence)中获取,每个事务都会生成一条新的记录,每条记录都要获得一个新的序列号,因为从sequence中取出的值是单向递增的,当索引中插入数据,并且维护索引结构的时候,不得不一直走向索引的最右侧的分支,对于每一个操作,都会想要维护索引中最右边的叶节点,那么所有的操作都会关注同一个内存块,希望能够维护这块内存,这就是一种典型的竞争形式。但在同一时间,只有一个人能够修改这块内存,因此当有一个人在修改的时候,其他所有想修改的人只能处于等待状态。 在一个并发量很大的OLTP系统中,开发者希望记录每个用户的登录和操作情况,因此需要创建基于主键的索引。接下来我们将通过实验说明如何减少这类索引竞争。 首先来看在没有索引的情况下系统的运行状况,系统运行平稳并且性能良好。如下图所示: 接下来我们尝试最简单的B树索引,索引的的值是通过sequence生成的

oracle oltp系统索引使用监控

◇◆丶佛笑我妖孽 提交于 2020-01-11 10:27:45
1.使用语句监控应用帐号的normal索引 select owner, 'alter index ' || owner || '.'||'"'||index_name||'"'||' monitoring usage;' from dba_indexes where index_type = 'NORMAL' and uniqueness = 'NONUNIQUE' and owner in ( select username from dba_users t where t.account_status='OPEN' and t.default_tablespace not in ('SYSTEM','USERS','SYSAUX')); 2.查询索引是否被使用 select us.username owner, io.name index_name, t.name table_name, decode(bitand(i.flags, 65536), 0, 'NO', 'YES') monitoring, decode(bitand(ou.flags, 1), 0, 'NO', 'YES') used, ou.start_monitoring, ou.end_monitoring from sys.obj$ io, sys.obj$ t, sys.ind$ i, sys

oracle sql优化

笑着哭i 提交于 2020-01-11 07:16:29
整理一下网上所看到sql优化方法 1 、 使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2 减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多条sql。 当执行每条SQL语句时,ORACLE在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。由此可见,减少访问数据的次数,就能实际上减少ORACLE的工作量。 例如: 以下有三种方法可以检索出雇员号等于0342或0291的职员。 方法1(最低效) SELECT EMP_NAME,SALARY,GRADE FROM EMP WHERE EMP_NO=342; SELECT EMP_NAME,SALARY,GRADE FROM EMP WHERE EMP_NO=29; 方法2(高效) SELECT A.EMP_NAME,A.SALARY,A.GRADE, B.EMP_NAME,B.SALARY,B.GRADE FORM EMP A,EMP B WHERE A.EMP_NO=342 AND B.EMP_NO=29 3 减少对表的查询 在含有子查询的SQL语句中,要特别注意减少对表的查询。例如: 低效 SELECT TAB_NAME FROM TABLES WHERE TAB_NAME=(SELECT TAB_NAME FROM TAB_COLUMNS

Oracle 监控索引使用

ε祈祈猫儿з 提交于 2020-01-11 00:18:00
Oracle提供一个监控索引的方法,来确定索引是否被使用。如果索引没有被使用,就可以删除它们以减少不必要的语句的开销。因为表上的大量不必要的索引可能会降低DML语句的性能,给数据库性能产生压力。所以生产环境上,以根据业务增长情况定期监控、分析数据库索引的使用,特别是一些大表上的索引,提升数据库事务提交的性能。 --查看表上的索引 SQL> Selectindex_name,table_name,num_rows From dba_indexes i Where i.table_name ='WEBSITE_VIEW_TB' ; INDEX_NAME TABLE_NAME NUM_ROWS ------------------------------------------------------------ ---------- CURRTIME_IDX WEBSITE_VIEW_TB 79284331 ORDERNO_IDX WEBSITE_VIEW_TB 2021984 ORDERSOURCE_IDX WEBSITE_VIEW_TB 938174 --开启索引监控 SQL> ALTER INDEX CURRTIME_IDX MONITORING USAGE; Index altered --查看索引监控 SQL> Select * From v$object_usage;

Mysql数据库的索引和视图详解

不羁岁月 提交于 2020-01-10 17:37:37
Mysql数据库的索引和视图详解 索引的概念 数据库的索引与书籍中的目录类似 在一本书中,无需阅读整本书,利用目录就可以快速查找所需信息 书中的目录是一个词语列表,其中注明了包含各个词的页码 数据库索引 在数据库中,索引数据库程序无需对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引是某个表中一列或若干列的集合,以及物理标识这些值的数据页的逻辑指针清单 索引的作用 设置了合适的索引之后,数据库利用葛总快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本 通过创建唯一索引保证数据表数据的唯一性 可以加快表与表之间的连接 在使用分组和排序时,可大大减少分组和排序时间 索引分类 普通索引 这是最基本的索引类型,而且它没有唯一性的限制 唯一性索引 索引的列的所有值都只能出现一次,即必须唯一 主键 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY” 全文索引 全文索引可以在VARCHAR或者TEXT类型的列上创建 创建索引的原则依据 表的主键,外键必须有索引 数据量超过300行的表应该有索引 经常与其他表进行连接的表,在连接字段上应该建立索引 唯一性太差的字段不适合建立索引 更新太频繁的字段不适合创建索引 经常出现在Where字句中的字段,特别是大表的字段

基于oracle的sql优化

↘锁芯ラ 提交于 2020-01-10 13:53:45
基于oracle的sql优化 基于oracle的sql优化 一.编写初衷描述 在应有系统开发初期,由于数据库数据较少,对于sql语句各种写法的编写体现不出sql的性能优劣,随着数据的不断增加,出现海量数据,劣质sql与优质sql在执行效率甚至存在百倍差距,可见sql优化的重要性 二.Sql语句性能优化 2.1 认识Oracle的执行过程 2.2 Oracle优化法则—漏斗法则 2.3 Oracle 执行计划 2.3.1 什么是Oracle执行计划 执行计划是一条查询语句在Oracle中执行过程或者访问路径的描述. 2.3.2 查看Oracle执行计划 1.执行计划常用的列字段解释 基数:返回的结果集行数 字节:执行该步骤后返回的字节数 耗费(cust),CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好. 2.3.3 看懂Oracle执行计划 2.3.3.1执行顺序 根据缩进来判断,缩进最多的最先执行(缩进相同时,最上面的最先执行) 2.4 表的访问方式 TABLE ACCESS FULL ( 全表扫描 ) TABLE ACCESS BY ROWID ( 通过rowid的表存取 ) TABLE ACCESS BY INDEX SCAN ( 索引扫描 ) 2.4.1 ABLE ACCESS FULL(全表扫描) Oracle会读取表中的所有行

Oracle 索引扫描的几种情况

你离开我真会死。 提交于 2020-01-10 00:30:59
index range scan ( 索引范围扫描 ) : 1. 对于 unique index 来说,如果 where 条件后面出现了 <,> ,between ...and... 的时候,那么就可能执行 index range scan, 如果 where 条件后面是 = ,那么就会执行 index unique scan 。 2. 对于 none unique index 来说 如果 where 条件后面出现了 =,>,<,betweed...and... 的时候,就有可能执行 index range scan 。 3. 对于 组合索引 来说,如果 where 条件后面出现了组合索引的引导列,那么可能执行 index range scan 。 index fast full scan ( 索引快速全扫描 ) : 如果 select 语句后面中的列都被包含在组合索引中,而且 where 后面没有出现组合索引的引导列,并且需要检索出大部分数据,那么这个时候可能执行 index fast full scan 。 index fast full scan 发生的条件 : 1. 必须是组合索引 ? 。 2. 引导列不在 where 条件中 index skip scan ( 索引跳跃式扫描 ) 当查询可以通过组合索引得到结果,而且返回结果很少,并且 where

sql查询10则小技巧

亡梦爱人 提交于 2020-01-09 16:52:40
1.不要使用in操作符,这样数据库会进行全表扫描, 推荐方案:在业务密集的SQL当中尽量不采用IN操作符 2.not in 使用not in也不会走索引 推荐方案:用not exists或者(外联结+判断为空)来代替 3<> 操作符(不等于) 使用<>同样不会使用索引,因此对它的处理只会产生全表扫描 推荐方案:用其它相同功能的操作运算代替,如 a<>0 改为 a>0 or a<0 a<>’’ 改为 a>’’ 4.IS NULL 或IS NOT NULL操作(判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。 推荐方案:用其它相同功能的操作运算代替,如 a is not null 改为 a>0 或a>’’等。 5.> 及 < 操作符(大于或小于操作符) 大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的 情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。 那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时 ORACLE则直接找到=3的记录索引。 6.LIKE操作符 LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询

SQL优化34条

早过忘川 提交于 2020-01-09 04:51:57
我们要做到不但会写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参数, 可以增加每次数据库访问的检索数据量 ,建议值为200