Oracle中如何判断SQL是否真正做了排序

在Oracle中,有时候在执行计划中看到sort关键字,就有人认为是做了排序,其实不一定。可以用下面的方法实验:

drop table test purge;

create table test as select * from dba_objects;

exec dbms_stats.gather_table_stats(user,‘test‘);

select /*+gg_test*/* from test order by object_id;

select /*+gg_test*/* from test order by object_id,object_name;

select /*+gg_test*/* from test order by object_id,object_name,object_type;

--#keys表示返回的结果中排序的字段数量

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 order by object_id ‘)

and operation=‘SORT‘ and options=‘ORDER BY‘;

PROJECTION

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

(#keys=1) "TEST"."OBJECT_ID"[NUMBER,22], "TEST"."OWNER"[VARCHAR2,30], "TEST"."OBJECT_NAME"[VARCHAR2,128],

"TEST"."SUBOBJECT_NAME"[VARCHAR2,30], "TEST"."EDITION_NAME"[VARCHAR2,30],

"TEST"."DATA_OBJECT_ID"[NUMBER,22], "TEST"."OBJECT_TYPE"[VARCHAR2,19], "TEST"."CREATED"[DATE,7],

"TEST"."LAST_DDL_TIME"[DATE,7], "TEST"."TIMESTAMP"[VARCHAR2,19], "TEST"."STATUS"[VARCHAR2,7],

"TEST"."TEMPORARY"[VARCHAR2,1], "TEST"."GENERATED"[VARCHAR2,1], "TEST"."SECONDARY"[VARCHAR2,1],

"TEST"."NAMESPACE"[NUMBER,22]

SQL>select projection

from v$sql_plan_statistics_all

where sql_id in(select sql_id from v$sql where

sql_text=‘select /*+gg_test*/* from test order by object_id,object_name ‘)

and operation=‘SORT‘ and options=‘ORDER BY‘;

PROJECTION

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

(#keys=2) "TEST"."OBJECT_ID"[NUMBER,22], "TEST"."OBJECT_NAME"[VARCHAR2,128], "TEST"."OWNER"[VARCHAR2,30],

"TEST"."NAMESPACE"[NUMBER,22], "TEST"."SUBOBJECT_NAME"[VARCHAR2,30], "TEST"."EDITION_NAME"[VARCHAR2,30],

"TEST"."DATA_OBJECT_ID"[NUMBER,22], "TEST"."OBJECT_TYPE"[VARCHAR2,19], "TEST"."CREATED"[DATE,7],

"TEST"."LAST_DDL_TIME"[DATE,7], "TEST"."TIMESTAMP"[VARCHAR2,19], "TEST"."STATUS"[VARCHAR2,7],

"TEST"."TEMPORARY"[VARCHAR2,1], "TEST"."GENERATED"[VARCHAR2,1], "TEST"."SECONDARY"[VARCHAR2,1]

SQL>select projection

from v$sql_plan_statistics_all

where sql_id in(select sql_id from v$sql where

sql_text=‘select /*+gg_test*/* from test order by object_id,object_name,object_type ‘)

and operation=‘SORT‘ and options=‘ORDER BY‘;

PROJECTION

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

(#keys=3) "TEST"."OBJECT_ID"[NUMBER,22], "TEST"."OBJECT_NAME"[VARCHAR2,128],

"TEST"."OBJECT_TYPE"[VARCHAR2,19], "TEST"."OWNER"[VARCHAR2,30], "TEST"."NAMESPACE"[NUMBER,22],

"TEST"."SUBOBJECT_NAME"[VARCHAR2,30], "TEST"."EDITION_NAME"[VARCHAR2,30],

"TEST"."DATA_OBJECT_ID"[NUMBER,22], "TEST"."SECONDARY"[VARCHAR2,1], "TEST"."CREATED"[DATE,7],

"TEST"."LAST_DDL_TIME"[DATE,7], "TEST"."TIMESTAMP"[VARCHAR2,19], "TEST"."STATUS"[VARCHAR2,7],

"TEST"."TEMPORARY"[VARCHAR2,1], "TEST"."GENERATED"[VARCHAR2,1]

时间: 2024-10-15 14:15:26

Oracle中如何判断SQL是否真正做了排序的相关文章

oracle中如何判断一个字符串是否含有汉字

oracle中如何判断一个字符串是否含有汉字 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ①全角字符的判断,或者是含有汉字的字符串的判断 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 一.2.2 实验环境介绍 11.2.0.3  RHEL6.5 一.2.3 本文简介 看到网友问,怎么查询表中某个字段数据是不是包含了

Oracle中如何判断字符串是否全为数字

Oracle中如何判断字符串是否全为数字 学习了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html 本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数).这个办法是一个公司同事发现的,用起来很方便,但理解起来稍有点困难.1.通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii

oracle中的基础sql

1.SQL SQL(Structured Query Language) 语言是目前主流的关系型数据库上执行数据操作.数据检索以及数据库维护所需要的标准语言,是用户与数据库之间进行交流的接口,许多关系型数据库管理系统都支持SQL语言,但不同的数据库管理系统之间的SQL语言不能完全通用,Oracle数据库使用的SQL语言是Procedural Language/SQL(简称PL/SQL). 1.1SQL语言分类 通常将SQL语言分为以下4类. (1)数据定义语言(Data Definition L

oracle中视图v$sql的用途

1.获取正在执行的sql语句.sql语句的执行时间.sql语句的等待事件: select a.sql_text,b.status,b.last_call_et,b.machine,b.event,b.program from v$sql a,v$session b where a.sql_id=b.sql_id 2.获取sql语句执行时间: select sql_text,cpu_time/1000/1000 t_cpu,trunc(elapsed_time/1000/1000) t_elaps

Oracle中rownum和 order by联合使用导致排序错乱

在使用Oracle进行分页查询的时候,一般情况下我们都会携带很多参数.但是今天发现一个很奇怪的东西,当排序字段不是主键,且多条数据中该排序字段的值均相同的情况下,会出现分页查询的排序顺序和不分页查询的排序顺序不一样的情况.下面直接用SQL来说明一下: 1.原始的查询SQL select ty.countryname,ty.s_adddate from t_d_Country ty order by ty.s_adddate desc; 2.执行分页的查询SQL select * from (se

Oracle 中如何判断一个字符串是否为数字

方法一:通过 To_Number 函数异常来判断 CREATE OR REPLACE FUNCTION Is_Number ( str_    VARCHAR2 ) RETURN VARCHAR2 IS num_    NUMBER; BEGIN num_ := to_number(str_); RETURN 'Y'; EXCEPTION WHEN OTHERS THEN RETURN 'N'; END Is_Number; / SQL> select Is_Number('12345') fr

Oracle 中的PL/SQL、存储过程、触发器、函数、包(学习笔记)

   一.PL/SQL是什么? PL/SQL(procedural language/SQL)是oracle在sql上的扩展,pl/sql不仅允许嵌入sql语言,而且可以定义常量和变量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这使得它的功能十分强大.但是移植性不好. 1. 实例1 只包括执行部分的PL/SQL块 set serveroutput on; begin dbms_output.put_line('asdasdasdas'); end; / set serverout 选

Oracle中如何用SQL检测字段是否包括中文字符

用Oracle的编码转换的函数Convert实现,测试后可行. SQL> select *  2    from (select 'abcd' c1 from dual  3          union all  4          select 'ab测试cd' c1 from dual)  5   where c1 <> CONVERT(c1, 'US7ASCII', 'ZHS16GBK'); C1--------ab测试cd CONVERT函数说明: CONVERT(input

【Oracle】oracle中快速判断某一日期是闰年或平年

select case when to_char(last_day(add_months(trunc( sysdate ,'y'),1)),'dd') = '28' then '平年' else '闰年' end as isLeapYear from dual 第一步:取日期的年初日期:第二步:年初日期增加一个月即概念2月:第三步:取概念2月的最后一天的日进行判断,如为28则平,如为29则闰 ----------------------------------------------------