Oracle 执行计划中的buffer sort

Oracle 执行计划中的buffer sort实际上没有排序,只是把数据加载到内存,不扫描多次表。

--制造数据

drop table test purge;

drop table test1 purge;

create table test as select * from dba_objects where rownum<10;

create table test1 as select * from dba_objects where rownum<10;

create index ind_t_object_id on test(object_id);

create index ind_t1_object_id on test1(object_id);

exec dbms_stats.gather_table_stats(user,‘test‘,cascade => true);

exec dbms_stats.gather_table_stats(user,‘test1‘,cascade => true);

--执行SQL

select /*+gg_test*/* from test t, test1 t1 where t.object_name like ‘T%‘;

----------------------------------------------------------

Plan hash value: 702683263

------------------------------------------------------------------------------

| Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |       |     9 |  1350 |     6   (0)| 00:00:01 |

|   1 |  MERGE JOIN CARTESIAN|       |     9 |  1350 |     6   (0)| 00:00:01 |

|*  2 |   TABLE ACCESS FULL  | TEST  |     1 |    75 |     3   (0)| 00:00:01 |

|   3 |   BUFFER SORT        |       |     9 |   675 |     3   (0)| 00:00:01 |

|   4 |    TABLE ACCESS FULL | TEST1 |     9 |   675 |     3   (0)| 00:00:01 |

------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - filter("T"."OBJECT_NAME" LIKE ‘T%‘)

统计信息

----------------------------------------------------------

1  recursive calls

0  db block gets

3  consistent gets

0  physical reads

0  redo size

1991  bytes sent via SQL*Net to client

348  bytes received via SQL*Net from client

1  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

0  rows processed

--#keys=0表示没有排序,Oracle中如何判断SQL是否真正做了排序

select projection

from v$sql_plan_statistics_all

where sql_id in(select sql_id from v$sql where

sql_text like‘select /*+gg_test*/* from test t, test1 t1 where t.object_name like ‘‘T%‘‘ ‘)

and operation=‘BUFFER‘ and options=‘SORT‘;

(#keys=0) "T1"."OWNER"[VARCHAR2,30], "T1"."OBJECT_NAME"[VARCHAR2,128], "T1"."SUBOBJECT_NAME"[VARCHAR2,30], "T1"."OBJECT_ID"[NUMBER,22], "T1"."DATA_OBJECT_ID"[NUMBER,22], "T1"."OBJECT_TYPE"[VARCHAR2,19],
"T1"."CREATED"[DATE,7], "T1"."LAST_DDL_TIME"[DATE,7], "T1"."TIMESTAMP"[VARCHAR2,19], "T1"."STATUS"[VARCHAR2,7], "T1"."TEMPORARY"[VARCHAR2,1], "T1"."GENERATED"[VARCHAR2,1], "T1"."SECONDARY"[VARCHAR2,1], "T1"."NAMESPACE"[NUMBER,22], "T1"."EDITION_NAME"[VARCHAR2,30]

时间: 2024-11-24 02:53:43

Oracle 执行计划中的buffer sort的相关文章

Oracle执行计划中 并行和BUFFER SORT的问题

近日开发说某个系统上有个sql执行时间忽快忽慢,让我帮忙看下,此sql是4个表(2个千万,2个十万)进行inner join操作,最后进行count(*)聚合操作,执行时间1--10S不等.查看执行计划发现使用了PX并行和BUFFER SORT操作,难怪忽快忽慢的,但是sql并没有显式加parallel,参数parallel_server也没有启用,这个并行和BUFFER SORT是从那来的呢? 下面通过实验来重现上面的情况: 1. PX并行和BUFFER SORT: select /*+ pa

Oracle执行计划中的索引

Oracle执行计划根据索引的类型与where限制条件的不同,有5种类型的索引扫描,分别是:索引唯一扫描(index unique scan),索引范围扫描(index range scan),索引全扫描(index full scan),索引快速扫描(index fast full scan)索引跳跃式扫描 (index skip scan). 1.索引唯一扫描(index unique scan) 通过唯一索引查找一个数值经常返回单个ROWID.如果存在UNIQUE 或PRIMARY KEY

闲谈Oracle执行计划的步骤顺序

经过长时间学习Oracle,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西.Oracle执行计划的每一步返回一组行,它们或者为下一步所使用,或者在最后一步时返回给发出SQL语句的用户或应用.由每一步返回的一组行叫做行源(row source).下面得树状图显示了从一步到另一步行数据的流动情况.每步的编号反映了在你观察Oracle执行计划时所示步骤的顺序(如何观察Oracle执行计划将被简短地说明).一般来说这并不是每一步被执行的先后顺序. Oracle执行计划的每一步或者

Oracle 执行计划(Explain Plan)

执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述.即就是对一个查询任务,做出一份怎样去完成任务的详细方案. 如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 看懂执行计划也就成了SQL优化的先决条件. 通过执行计划定位性能问题,定位后就通过建立索引.修改sql等解决问题. 一.执行计划的查看 1.1 设置autotrace autotrace命令如下 序号 命令 解释 1 SET AUTOTRACE OFF 此为默认值,即关闭A

Oracle 执行计划(Explain Plan) 说明

http://blog.csdn.net/tianlesoftware/article/details/5827245 如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题. 看懂执行计划也就成了SQL优化的先决条件. 这里的SQL优化指的是SQL性能问题的定位,定位后就可以解决问题. 一.         查看执行计划的三种方

Oracle执行计划详解

 简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容. 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 Rowid的概念 Recursive Sql概念 Predicate(谓词) DRiving Table(驱动表) Probed Table(被探查表) 组合索引(concatenated index) 可选择性(selectivity) 二.oracle访问数据的存取方法 1) 全表扫描(Full Table Scan

Oracle执行计划

Oracle执行计划 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing- 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具  ->  首选项 ->   窗口类型  ->  计划窗口  ->  根据需要配置要显示在执行计划中的列

查看Oracle执行计划的几种常用方法-系列3

续上篇:http://blog.csdn.net/bisal/article/details/39225373 4. 10046事件 通过10046事件也可以查看目标SQL的执行计划.像10046这种事件,都不是Oracle官方文档中可以查询到的,这些事件一般用于调试目的,因此往往可以使用他们找到问题更详细的信息. 10046事件和之前的explain plan.DBMS_XPLAN包以及AUTOTRACE开关的区别在于,10046事件产生的trc文件中明确显示了目标SQL实际执行计划中每一步所

如何看懂ORACLE执行计划

如何看懂Oracle执行计划 一.什么是执行计划 An explain plan is a representation of the access path that is taken when a query is executed within Oracle. 二.如何访问数据 At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle bloc