oracle执行计划

oracle索引碎片

走远了吗. 提交于 2019-11-26 14:34:32
author:skate time:2010-05-31 索引页块碎片(Index Leaf Block Fragmentation) 这篇文章将会回答如下问题: 什么是索引页块碎片?什么时候被重用? 什么是半空索引碎片?什么时候被重用? oracle的标准索引结构是B×tree结构,一个B×tree结构由三种block组成 根块(root block): 在B×tree里有且只有一个block,所有访问索引都从这开始,root block下有很多child blocks。 分支块(Branch blocks): 这是中间层,branch block是没有什么限制的,它是随着leaf block的增加而增加的,branch block一般是4层,如果多于4层,就影响性能了。在我们删除行时,branch block是不被删除的。 叶块(leaf block): 叶块是最底层,上面存储着索引条目和rowid 索引和表数据是级联关系的,当删除表数据的时候,索引条目也会被自动删除,这样在index leaf block就会产生碎片,这也就是在OLTP系统上有大量更新的表上不建议创建大量的索引,很影响性能 有的人说删除过的索引条目空间不会被再用,因为在应用中不会再有insert相同的数据。其实这个 说法不完全对的,除了半空叶块外,其他的删除的索引空间是可被再利用的。 eg:

Oracle执行计划不走索引的原因总结

前提是你 提交于 2019-11-26 14:32:55
在 Oracle 数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确 不走索引 呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下。 不走索引大体有以下几个原因: 你在Instance级别所用的是all_rows的方式 你的表的统计信息(最可能的原因) 你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 解决方法: 可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。 不走索引的其它原因: 1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。 2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。 3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。 4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5

oracle 不走索引的原因

让人想犯罪 __ 提交于 2019-11-26 14:31:34
create table tb2 as select * from emp; alter table tb2 modify empno number(4) not null; 翻到20W行 create index idxtb21 on tb2(empno); select INDEX_NAME from dba_indexes where table_name='TB2';--验证index建立起来 set autotrace on; select distinct empno from tb2;--走index select distinct ename from tb2 where empno=7934;--未走index select distinct ename from tb2 where empno=7934;--hint后,也未走index create index idxtb22 on tb2(ename);--难道和ename有关系?(按理说应该没关系,建上吧) select ename from tb2 where empno=7934;--还是不走index 重建index alter index idxtb21 rebuild ; 1.alter index xxx rebuild [online]; 是否加online,要看你的系统需求

oracle优化一则--不走索引

此生再无相见时 提交于 2019-11-26 14:31:02
1、问题 一个查询未走索引,从一个视图中查询,视图定义为5张表的union all。 有明显的条件TMH12 = '1001271876' 2、排查 @?/rdbms/admin/sqltrpt 脚本生成优化建议 通过建议来看,是生成索引的建议,对列进行格式转换,TO_CHAR("TMH12"), 1- Index Finding (see explain plans section below) The execution plan of this statement can be improved by creating one or more indices. Recommendation (estimated benefit: 99.48%) Consider running the Access Advisor to improve the physical schema design or creating the recommended index. create index HICANO_POS.IDX 2 0260001 o n H I C A N O P O S . E C P H P D A ( T O C H A R ( " T M H 12 " ) ) ; − C o n s i d e r r u n n i n g t h e A c c e s s

Oracle SQL不走索引小记

折月煮酒 提交于 2019-11-26 14:30:38
SQL执行计划不走索引 一、优化器认为走全表扫描更优。 在这种情况下,需要重新分析一遍表,更新表的状态,有助于优化器分析出正确的执行计划。 analyze table tablename compute statistics; analyze index indexname compute statistics; 或者 execdbms_stats.gather_schema_stats( - ownname => 'SCOTT', - options => 'GATHER AUTO', - estimate_percent => dbms_stats.auto_sample_size, - method_opt => 'for all columns size repeat', - degree => 15 - ) 二、优化器模式 使用了all_rows模式 三、无法使用索引。 无法使用索引是由于sql写法有问题。 1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。 2、在包含有null值的table列上建立索引。 3、在索引列上使用函数时不会使用索引。 select * from table_name from to_char(date,'YYYY/MM/DD')='2015/01/01' 不走索引 select * from

看懂Oracle执行计划

老子叫甜甜 提交于 2019-11-26 12:29:25
一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计划中的列 执行计划的常用列字段解释: 基数(Rows):Oracle估计的当前操作的返回结果集行数 字节(Bytes):执行该步骤后返回的字节数 耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入) 时间(Time):Oracle估计的当前操作所需的时间 ②:打开执行计划: 在SQL窗口执行完一条select语句后按 F5 即可查看刚刚执行的这条查询语句的执行计划 注:在PLSQL中使用SQL命令查看执行计划的话,某些SQL*PLUS命令PLSQL无法支持,比如SET AUTOTRACE ON 三:看懂Oracle执行计划 ①:执行顺序: 根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行) 例:上图中 INDEX RANGE SCAN 和 INDEX UNIQUE SCAN 两个动作缩进最多,最上面的 INDEX RANGE SCAN 先执行;