
execution plan
事后诸葛亮
深入浅出!
展开
-
RBO基于规则的优化器!
优化器:oracle中优化器(Optimizer)是sql分析和执行的优化工具,它负责制订sql的执行计划。oracle的优化器有两种,基于规则的优化器(RBO)和基于代价的优化器(CBO),从oracle 10g开始,RBO已经被测底的废弃拉。谓词:就是指一个查询中where限制条件。基于规则的优化器(RBO):就是在优化器里面嵌入若干种规则,执行的sql语句符合哪种规则,则按照哪种规则原创 2011-10-27 16:21:57 · 2902 阅读 · 0 评论 -
oracle外联结无法改变驱动表!
SQL> select /*+ leading(e) */ e.*,d.* from emp e,dept d where e.deptno=d.deptno;执行计划----------------------------------------------------------Plan hash value: 1123238657-------------------原创 2013-01-05 15:04:55 · 767 阅读 · 0 评论 -
(4)选择率(selectivity)的相关问题
本章将讨论采用标准的选择率计算方式却产生不合适结果的一些最常见原因。1、前导零创建一个包含2000000行数据的表,它有一个id列,采用序号并利用0来进行填充其他位。因此典型的存储值将是A00000000000000001,系统中绝大部分使用这种策略的查询,类似于where id={string constant}的形式;但是,如果它们使用了基于区间的谓词,可能将出现一些奇怪的性能问题。原创 2013-02-06 16:04:14 · 1607 阅读 · 0 评论 -
(3)聚簇因子(CLUSTERING_FACTOR )——上
大家知道数据表中的数据都是无序的存在库中,当我们在对数据进行检索的时候,查找起来很是耗费资源,于是我们就需要为表创建索引,索引的作用就是把表中的数据按照一定的顺序排列保存起来,于是就出现了一个问题,有的表中的数据和索引想要排列的顺序很是相近,而另一些表中的数据和索引想要排列的顺序相距甚远,聚簇因子的作用就是用来标示这个的,聚簇因子越小,相似度越高,聚簇因子越大,相似度越低。1、列顺序当计算原创 2013-02-04 17:41:31 · 1286 阅读 · 0 评论 -
(5)直方图(histograms)
1、入门SQL> create table t1 2 as 3 with kilo_row as ( 4 select /*+ materialize */ 5 rownum 6 from all_objects 7 where rownum <= 1000 8 ) 9 select 10 trunc(7000原创 2013-02-20 16:45:20 · 1473 阅读 · 0 评论 -
(3)校正聚簇因子(CLUSTERING_FACTOR )——下
1、ASSM带来的性能问题ASSM通过增加数据的分布的随机性来减少争用。在ASSM下,并发的进程基本都选择不同的块来插入数据行。因此,在我们使用序列或者以日期作为插入顺序的表并在其上面建立索引的话,可能将会导致索引的聚簇因子比较大。SQL> create tablespace assm datafile '+DG' size 100m autoextend on next 100m max原创 2013-02-05 16:31:16 · 1413 阅读 · 0 评论 -
(1)oracle单表选择率(selectivity)——计算执行计划的基数
CBO优化器是基于对当前经过特定测试的数据集中预期的行比率估计来计算基数的。此处的行数之比是一个数值,称为选择率(selectivity)。得到选择率之后,将其与输入行数进行简单相乘既可得到基数。在理解选择性之前,必须得对user_tab_col_statistics视图有一定了解:SQL> desc user_tab_col_statistics 名称原创 2013-01-25 15:35:52 · 4734 阅读 · 0 评论 -
(2)简单B树访问——计算执行计划的成本
通过索引来访问表的成本公式应该包含3个与块相关的组件:按降序遍历的分支层数、遍历 叶块的数目和访问过的表块的数目。1、入门SQL> create table t1 2 nologging 3 as 4 select 5 trunc(dbms_random.value(0,25))n1, --n1会产生25个不同的值。 6 rpad('x',40)ind_原创 2013-01-28 17:47:09 · 922 阅读 · 0 评论 -
(6)位图索引(bitmap)
1、入门SQL> create table t1 2 pctfree 70 3 pctused 30 4 nologging 5 as 6 select 7 mod((rownum-1),20) n1, -- 散布值为20 8 trunc((rownum-1)/500) n2, -- 集群值为20 9 -原创 2013-02-25 10:02:42 · 614 阅读 · 0 评论 -
(7)查询转换
查询转换——视图合并(1)!查询转换——子查询解嵌套(2)!查询转换——谓语前推(3)!查询转换——使用物化视图进行查询重写(4)!半联结&反联结!原创 2013-02-27 16:14:16 · 520 阅读 · 0 评论 -
(8)连接基数
1、两表连接oracle有两个公式用于连接基数的计算:假设我们对表t1和t2进行连接,连接列分别是c1和c2。Join Selectivity = ((num_rows(t1) - num_nulls(t1.c1)) / num_rows(t1)) * ((num_rows(t2) - num_nulls(t2.c2)) / num_rows(t2)) /原创 2013-02-27 17:38:08 · 1102 阅读 · 0 评论 -
查询转换——子查询解嵌套(2)!
子查询解嵌套与视图合并的相似之处在于子查询也是通过一个单独的查询块来表示的。可合并的视图与可以解嵌套的子查询之间的主要区别在于它们的位置是不同的:子查询位于WHERE子句。/*+ NO_UNNEST */ 禁止子查询解嵌套转换。SQL> select /*+ gather_plan_statistics */ * from emp where deptno in(select dep原创 2012-12-20 12:54:47 · 1014 阅读 · 0 评论 -
查询转换——视图合并(1)!
查询转换的主要目的就是确定如果改变查询的写法会不会提供更好的查询计划。查询转换能够并且可能会重写你的查询。查询转换器可能会改变你最初所写查询的结构,只要这样的改变不会影响结果集。视图合并是一种将内嵌或存储试视图展开为能够独立分析或者与查询剩余部分合并成总体执行计划的独立查询块的转换。/*+ NO_QUERY_TRANSFORMATION */ 禁止查询转换。/*+ MERGE(TA原创 2012-12-19 17:35:59 · 1915 阅读 · 0 评论 -
半联结&反联结!
半联结是在两个数据集(表)之间的联结,其中第一个数据集中的数据行在决定是否返回时会根据在另一个数据集中出现或不出现至少一个相匹配的数据行来确定。“不出先”匹配行——这是半联结的一种特殊形式,称为反联结。标准的内联结与半联结之间最主要的区别在于在半联结中,第1个数据集中的每一条记录至返回一次,而不管在第二个数据集中有几条匹配的数据。这个定义表明这个查询的实际处理过程可以通过在找到第1个匹配以后马原创 2012-12-26 16:40:37 · 1052 阅读 · 0 评论 -
CBO 基于成本的优化器!
CBO基于成本的优化器:让oracle获取所有执行计划的相关信息,通过对这些信息做计算分析,最后得出一个代价最小的执行计划作为最终执行计划。还是前面的例子,让我们再来看看CBO的表现:SQL> select /*+ all_rows */ * from t where id = 1;已选择50600行。执行计划----------------------原创 2011-10-27 17:11:10 · 1311 阅读 · 0 评论 -
Oracle10g获取sql语句的执行计划详解!
Oracle10g获取sql语句的执行计划详解 --- Oracle诊断或调优经常需要做的就是查看SQL语句的执行计划,很多时候我们需要得到sql语句在不同场景、不同时间段的执行计划。 一,通过explain plan命令获得sql语句的执行计划。 explain plan的命令格式如下: sql>Explain plan for sql statem转载 2012-06-14 18:00:20 · 1388 阅读 · 0 评论 -
并行执行!
并行处理内部的机制:首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递,这个协调进程将需要操作的数据集分割成很多部分,称为并行处理单元;然后并行协调进程给每个并行进程分配一个数据单元。比如有四个并行服务进程,他们就会同时处理各自分配的单元,当一个并行服务进程处理完毕后,协调进程就会给它分配另外的单元,如此反复,直到整个表上的数据都处理完,最后协调进程负责将每个小集合合并成一个原创 2012-06-20 22:34:27 · 1725 阅读 · 0 评论 -
bind peeking
光有统计信息是不够的,变量的值不同,可能采用的执行计划也不同,所以Oracle引入了bind peeking这个技术。但需要强调的是,即使是bind peeking,也只是发生在硬分析的时候。SQL> drop table t purge;表已删除。SQL> create table t as select 1 id,a.* from all_objects a;表已创建。SQ原创 2012-06-21 13:34:39 · 1718 阅读 · 0 评论 -
相关列问题!
先来创建一个表Tcreate table t as select level as id ,level||'a' as a,level||level||'b' as b from dual connect by level这里A列的值能够确定B列的值,insert into t select * from t; .............................. 一直重复转载 2012-12-03 11:12:09 · 466 阅读 · 0 评论 -
三种链接方式详解(HASH JOIN MERGE JOIN NESTED LOOP)
注意:本文转载自:http://blog.youkuaiyun.com/tianlesoftware/article/details/5826546在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式。 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图。从3张图里我们看到了几点信息:原创 2012-11-22 17:05:40 · 3776 阅读 · 0 评论 -
autotrace使用详解!
查看执行计划、统计信息、执行时间并且返回sql结果集:SQL> set autotrace on;SQL> set timing on;SQL> select count(*) from t; COUNT(*)---------- 50295已用时间: 00: 00: 00.01执行计划------------------------原创 2011-11-13 17:42:42 · 1243 阅读 · 0 评论 -
Hint分类总结!
1、和优化器相关的Hint/*+ rule */RBO:基于规则的优化器/*+ first_rows(n) */CBO:基于成本的优化器;(将结果集中的前n条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。)/*+ all_rows */CBO:基于成本的优化器;(用最快的速度将sql执行完毕,将结果集全部返回。)例子:原创 2011-10-29 16:49:14 · 1079 阅读 · 0 评论 -
解读sql的执行计划!
首先创建测试的表:SQL> show userUSER 为 "U1"SQL> create table t1 (id int,name varchar2(1000));表已创建。SQL> create table t2 (id int,name varchar2(1000));表已创建。SQL> create index ind_t1 on t1(id)原创 2011-10-27 20:40:56 · 972 阅读 · 0 评论 -
查询转换——使用物化视图进行查询重写(4)!
查询重写是一种发生在当一个查询或查询的一部分已经被保存为一个物化视图,转换器重写该查询以使用预先计算好的物化视图数据而不需要执行当前查询的转换。/*+ REWRITE(MVIEW_NAME) */ 使用物化视图进行查询重写。SQL> select e.empno, e.ename, e.job 2 from emp e, dept d 3 where e.deptn原创 2012-12-25 10:54:38 · 1744 阅读 · 0 评论 -
查询转换——谓语前推(3)!
谓语前推用来将谓语从一个内含查询块中应用到不可合并的查询块中。目标就是允许索引的使用或者让其他对于数据集的筛选在查询中能够更早的进行。/*+ NO_PUSH_PRED */ 禁止谓语前推。SQL> select e1.ename, e1.sal, v.avg_sal 2 from emp e1, 3 (select e2.deptno, avg(e2.sa原创 2012-12-25 10:29:12 · 1687 阅读 · 0 评论 -
Oracle执行计划详解!!!
Oracle执行计划详解---作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html---简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。并有总结和概述,便于理解与记忆!+++目录--- 一.相关的原创 2012-06-14 17:44:14 · 906 阅读 · 0 评论 -
获取sql的执行计划总结!
1、使用autotrace获取执行计划、解释计划要查看oracle sql 的执行计划有很多种方法:查看执行计划表、使用oracle第三方工具、使用sql*plus、利用sql trace跟踪文件、诊断事件10046等。这里介绍使用sql*plus的autotrace功能来查看sql的执行计划。autotrace功能的启用:SQL> @?/rdbms/admin/utlxp原创 2011-10-26 20:11:15 · 1069 阅读 · 0 评论