我们先用一个小表来,来说明一下,oracle执行计划该注意哪些地方。
hr@ORCL> set autotrace traceonly
hr@ORCL> select * from t;
模糊比较两条sql的优劣时,建议先查看以下两个值:
Cost (%CPU):cpu代价,这个值要代数和。比如,这里是3+3=6
consistent gets:这个值一般要多执行几次!让他稳定下来,才有比较的意义。
Execution Plan :
----------------------------------------------------------
Plan hash value: 1601196873
下面这个计划看的方法:由里到外,由上到下
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 6 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T | 1 | 6 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
228 recursive calls --访问数据字典得到元数据。第二次执行相同语句,递归调用基本为零。
0 db block gets -- 指DML语句所得到的数据块个数
33 consistent gets --重要!!指select语句所得到的数据块个数
8 physical reads --硬盘上读出的数据
0 redo size --产生的日志
414 bytes sent via SQL*Net to client --网络流量指标
385 bytes received via SQL*Net from client --网络流量指标
2 SQL*Net roundtrips to/from client
4 sorts (memory)
0 sorts (disk)
1 rows processed
现在,我们用一个大表,来把执行计划列出来。
sys@ORCL> select * from dba_objects;
50393 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2127761497
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 48669 | 8412K| 145 (5)| 00:00:02 |
| 1 | VIEW | DBA_OBJECTS | 48669 | 8412K| 145 (5)| 00:00:02 |
| 2 | UNION-ALL | | | | | |
|* 3 | FILTER | | | | | |
|* 4 | HASH JOIN | | 51423 | 4670K| 143 (5)| 00:00:02 |
| 5 | TABLE ACCESS FULL | USER$ | 62 | 868 | 2 (0)| 00:00:01 |
|* 6 | TABLE ACCESS FULL | OBJ$ | 51423 | 3967K| 140 (4)| 00:00:02 |
|* 7 | TABLE ACCESS BY INDEX ROWID| IND$ | 1 | 8 | 2 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | I_IND1 | 1 | | 1 (0)| 00:00:01 |
| 9 | TABLE ACCESS BY INDEX ROWID | LINK$ | 1 | 88 | 0 (0)| 00:00:01 |
| 10 | NESTED LOOPS | | 1 | 102 | 2 (0)| 00:00:01 |
| 11 | TABLE ACCESS FULL | USER$ | 62 | 868 | 2 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN | I_LINK1 | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
其实,前两列是颗二叉树。我们可以借助v$sql_plan视图,很容易把这颗树给画出来。
sys@ORCL> select id,parent_id
2 from v$sql_plan
3 where plan_hash_value=2127761497;
ID PARENT_ID
---------- ----------
0
1 0
2 1
3 2
4 3
5 4
6 4
7 3
8 7
9 2
10 9
11 10
12 10
通过上面的子节点和父节点,可得图如下:
把这颗二叉树后序遍历,就可以得到这条sql的执行顺序了:5,6,4,8,7,3,11,12,10,9,2,1,0
注意:
1)图中的数字,是从v$sql_plan查出来的。
2)画图总是从左孩子开始
3)二叉树要做后序遍历才是sql的执行顺序
分享到:
相关推荐
这是数据结构中二叉树的后序遍历的非递归算法的源代码。
为了避免递归带来的额外开销,可以使用栈来实现非递归后序遍历。基本思想是模拟递归调用栈。首先,遍历所有节点并按顺序压入栈,同时记录已访问过的节点。当遇到一个没有被访问过的节点时,将其右子节点和左子节点...
RS005二叉树后序遍历 动画演示
二叉树后序遍历的非递归算法是指在遍历二叉树时,不使用递归函数,而是使用栈来存储结点的方法。该算法的主要思想是使用一个栈来存储结点,通过标志 flag 区分同一个结点的两次出栈。 在该算法中,首先将根指针 ...
2. 栈的使用:由于后序遍历使用了非递归的方式,因此会涉及到栈的操作。在二叉树的非递归遍历中,栈用于保存访问顺序。在后序遍历中,访问顺序是先左子树,然后右子树,最后是根节点。 3. 树的遍历:报告中提到了...
大连理工大学数据结构上机 二叉树三种遍历,先序和中序建立二叉树,后序和中序建立二叉树,二叉搜索树查找,删除,插入
二叉树后序遍历详细过程.xlsx
二叉树后序遍历相关问题 题目描述 给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列。 输入描述: 输入为一行。 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔。保证...
二叉树的后序遍历是一种重要的树型结构遍历方式,它按照“左子树-右子树-根节点”的顺序访问每个节点。在递归实现中,这个过程相对直观,但非递归实现则需要借助辅助数据结构,如栈,来模拟递归调用的过程。本实验...
在实现这些操作时,二叉树通常使用结构体或类来定义,包含节点值、左子节点和右子节点的指针。提供的`二叉树.cpp`文件可能包含了这些功能的实现,包括创建、遍历和平衡性检查等方法。通过阅读和理解代码,我们可以...
本实验报告将详细介绍如何使用先序和中序建立二叉树,然后用后序遍历的方法输出二叉树的元素。 一、需求分析 本程序的需求是使用非递归的方法,利用先序和中序建立二叉树,然后用后序遍历的方法输出二叉树的元素。...
二叉树后序遍历是数据结构领域中的一个重要概念,主要应用于树形数据结构的遍历操作。在C++编程中,实现二叉树的后序遍历可以帮助我们有效地访问和处理树的所有节点,尤其在解决某些特定问题时,如计算表达式值、...
在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。后序遍历的特点是:左子树 -> 右子树 -> 根节点,这种遍历方式对于解决特定问题非常有用,如表达式树的构建。 在这个话题...
在深入探讨C语言实现二叉树的后序遍历(递归)之前,我们先来了解下二叉树以及后序遍历的基本概念。 **二叉树简介:** 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。...
4二叉树的后序遍历.swf
较难较易混淆的二叉树部分经典例题,不会的童鞋~~
1按先序次序输入二叉树中结点的值(一个字符),`0`表示空树,生成二叉树的二叉链表存储结构。然后按中序和后序顺序遍历二叉树输出结果。
二叉树的存储结构使用链表。 2、 提供操作:前序遍历、中序遍历、后序遍历、层次遍历、计算二叉树结点数目、计算二叉树高度。 3、 对建立好的二叉树,执行上述各操作。 4、 接收键盘录入的二叉树前序序列和中序序列...