概述

如何快速判断 SOL 执行计划是否高效,其实这是一个知识和经验的完美结合过程。其实也有一些维度可以作为参考的,下面一起来看看吧。


从执行计划读效率--返回行与逻辑读比率

DROP TABLE t;CREATE TABLE t as select * from dba_objects;--CREATE INDEX idx ON t (object_id);alter session set statistics_level=all;set linesize 200set pagesize 200select * from t where object_id=6;SELECT * FROM table(dbms_xplan.display_cursor(NULL,NULL,'allstats last')); 

说明:总共获取 1 条记录(A-ROWS),产生 1249 次逻辑读( Buffers),这里很明显就有问题了。


从执行计划读效率--评估值准确的重要性

1、创建测试数据

DROP TABLE t1;CREATE TABLE t1 (id, col1, col2, pad) AS SELECT rownum, CASE WHEN rownum>5000 THEN 666 ELSE rownum END,rownum, lpad('*',100,'*') FROM dualCONNECT BY level <= 10000;INSERT INTO t1 SELECT id+10000, col1, col2, pad FROM t1;INSERT INTO t1 SELECT id+20000, col1, col2, pad FROM t1;INSERT INTO t1 SELECT id+40000, col1, col2, pad FROM t1;INSERT INTO t1 SELECT id+80000, col1, col2, pad FROM t1;COMMIT;CREATE INDEX t1_col1 ON t1 (col1);DROP TABLE t2;CREATE TABLE t2 AS SELECT * FROM t1 WHERE mod(col2,19) != 0;ALTER TABLE t2 ADD CONSTRAINT t2_pk PRIMARY KEY (id);

2、统计分析,但是不搜集直方图

BEGIN dbms_stats.gather_table_stats( ownname=>user,  tabname=>'T1',  cascade=>TRUE, estimate_percent=>100, method_opt=>'for all columns size 1', no_invalidate=>FALSE);END;/BEGIN dbms_stats.gather_table_stats( ownname=>user,  tabname=>'T2',  cascade=>TRUE, estimate_percent=>100, method_opt=>'for all columns size 1', no_invalidate=>FALSE);END;/

3、评估值是否准确

set linesize 200set pagesize 200explain plan for SELECT count(t2.col2) FROM t1 ,t2 WHERE t1.id=t2.id and t1.col1 = 666;select * from table(dbms_xplan.display());
SELECT /*+ gather__plan_statistics */ count(t2.col2) FROM t1, t2 WHERE t1.id=t2.id and t1.col1 = 666;select * from table(dbms_xplan.display_cursor(NULL,NULL,'allstats last'));

从执行计划读效率--类型转换

drop table t_col_type purge;create table t_col_type(id varchar2(20),col2 varchar2(20),col3 varchar2(20));insert into t_col_type select rownum,'abc','efg' from dual connect by level<=10000;commit;create index idx_id on t_col_type(id);set linesize 200set autotrace traceonlyselect * from t_col_type where id=6;

如果是filter一般就是走全扫了,access是索引扫


从执行计划读效率--递归调用

1、创建测试数据

set autotrace off;drop table people purge;create table people (first_name varchar2(200),last_name varchar2(200),sex_id number);create table sex(name varchar2(20), sex_id number);insert into people (first_name,last_name,sex_id) select object_name,object_type,1 from dba_objects;insert into sex(name,sex_id) values('男',1);insert into sex(name,sex_id) values('女',2);insert into sex(name,sex_id) values ('不详',3);commit;

2、创建函数

create or replace function get_sex_name(p_id sex.sex_id%type) return sex.name%type isv_name sex.name%type;beginselect nameinto v_namefrom sexwhere sex_id=p_id;return v_name;end;/

3、查看递归调用

set autotrace traceonlyselect sex_id,first_name||' '||last_name full_name,get_sex_name(sex_id) gender from people;

从执行计划读效率--表访问次数

1、创建测试数据

DROP TABLE t1;CREATE TABLE t1 (id, col1, col2, pad)AS SELECT rownum, CASE WHEN rownum>5000 THEN 666 ELSE rownum END, rownum, lpad('*',100,'*')FROM dualCONNECT BY level <= 10000;INSERT INTO t1 SELECT id+10000, col1, col2, pad FROM t1;INSERT INTO t1 SELECT id+20000, col1, col2, pad FROM t1;INSERT INTO t1 SELECT id+40000, col1, col2, pad FROM t1;INSERT INTO t1 SELECT id+80000, col1, col2, pad FROM t1;COMMIT;CREATE INDEX t1_col1 ON t1 (col1);DROP TABLE t2;CREATE TABLE t2 AS SELECT * FROM t1 WHERE mod(col2,19) != 0;ALTER TABLE t2 ADD CONSTRAINT t2_pk PRIMARY KEY (id);

2、统计分析,但是不搜集直方图

BEGIN dbms_stats.gather_table_stats( ownname=>user,  tabname=>'T1',  cascade=>TRUE, estimate_percent=>100, method_opt=>'for all columns size 1', no_invalidate=>FALSE);END;/BEGIN dbms_stats.gather_table_stats( ownname=>user,  tabname=>'T2',  cascade=>TRUE, estimate_percent=>100, method_opt=>'for all columns size 1', no_invalidate=>FALSE);END;/

3、查看表访问次数

alter session set statistics_level=all;SELECT /*+ gather_plan_statistics */ count(t2.col2) FROM t1 ,t2 WHERE t1.id=t2.id and t1.col1 = 666;SELECT * FROM table(dbms_xplan.display_cursor(NULL,NULL,'allstats last'));

从执行计划读效率--表真实访问行数

drop table t1 cascade constraints;create table t1 as select * from dba_objects;drop table t2 cascade constraints;create table t2 (id1,id2) as select rownum ,rownum+100 from dual connect by level <=1000;set autotrace traceonly;select * from (select t1.*, rownum as rn from t1, t2 where t1.object_id = t2.id1) a where a.rn >= 1 and a.rn <= 10;select * from (select t1.*, rownum as rn from t1, t2 where t1.object_id = t2.id1 and rownum<=10 ) a where a.rn >= 1;

从执行计划读效率--是否排序

drop table t purge;create table t as select * from dba_objects;set autotrace traceonlyselect * from t where object_id>2 order by object_id;

上面是几个维度判断执行计划中sql的效率,实际上还有一个计算方式是通过consistent gets来计算内存大致使用多少,通过physical reads来计算IO。

后面会分享更多关于DBA方面内容,感兴趣的朋友可以关注下!!

oracle sql语句_7个维度查看oracle执行计划的sql语句执行效率相关推荐

  1. ORACLE 查看有多个执行计划的SQL语句

    在SQL优化过程,有时候需要查看哪些SQL具有多个执行计划(Multiple Executions Plans for the same SQL statement),因为同一个SQL有多个执行计划一 ...

  2. oracle执行脚本顺序执行吗,【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 - 不及格的飞鱼...

    记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 问题现象: STARiBOSS5.8.1R2版本中,河北对帐JOB执行时,无法生成发票对帐文件. 首先,Quartz表达式培植的启动时间为 ...

  3. 引用:初探Sql Server 执行计划及Sql查询优化

    引用:初探Sql Server 执行计划及Sql查询优化 原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之-- ...

  4. SQL Server 中的执行计划和SQL Server Profiler

    显示估计的执行计划 包括实际的执行计划 包括客户端统计信息 SQL Server Profiler

  5. oracle 修改默认日期格式_查看MySQL查询计划的方法和格式

    查看MySQL的查询计划是分析查询的重要方法,可以通过使用EXPLAIN语句来确认优化器将采取哪种查询计划,是否与你的预期一致. 如何使用EXPLIAN?使用它有两种方式: 直接在查询语句之前直接加上 ...

  6. oracle 查询 历史数据,利用闪回查看Oracle表历史时刻数据

    利用闪回查看Oracle表历史时刻数据 1.查看表历史时刻数据 select * from tab_test AS OF TIMESTAMP to_timestamp( 利用闪回查看Oracle表历史 ...

  7. oracle更新统计信息执行计划,为准确生成执行计划更新统计信息-analyze与dbms_stats...

    如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息. 例如索引跳跃式扫描(INDEX ...

  8. oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接

    小仙我在学习索引执行行为的时候,有个疑惑?那就是索引是找到一个值就马上回表,然后再找下一个值,再回表. 比如索引唯一扫描,索引范围扫描,索引全扫描,索引快速扫描.好像都是要回表.尤其是范围,不范围完后 ...

  9. oracle绑定变量执行计划,绑定变量对执行计划的影响

    发现无论启动或者关闭绑定变量窥探使用绑定变量的SQL都有可能选择错误的执行计划,当第一次硬解析产生执行计划时,之后的绑定变量SQL就会继续这个执行计划执行,有时可能是错的.如何改进呢? 1.当关闭绑定 ...

  10. 查看真实的执行计划 绑定变量对执行计划的影响--“绑定变量窥探”

    --##################################################### --####     AWR执行计划                           ...

最新文章

  1. 选择HttpHandler还是HttpModule?
  2. 12新特性格式化输出f-string
  3. 计算机网络实验(华为eNSP模拟器)——第十二章 VLAN集中管理协议(VCMP)
  4. C# 使用 WebBrowser 实现 HTML 转图片功能
  5. 建立你第一个 Outlook Add-in
  6. android水印添加水印,android 增加背景文字 水印效果(仿钉钉)
  7. 业界首款!小米10至尊纪念版将有屏下摄像头版本
  8. 中考计算机考试试题山西注意事项,2021年山西省中考考试注意事项(3)
  9. qml入门学习(八):通过loader对象动态加载和移除组件
  10. Eclipse快捷键大全(同样适用基于Eclipse开发的IDE)
  11. BLURtooth 漏洞导致攻击者覆写蓝牙认证密钥
  12. Ubuntu已经很好用了
  13. 卡巴斯基KEY文件的类型选择
  14. 示波器截取的波形图和数据CSV文件表,导入到MATLAB的simulink模型进行FFT分析,简单实用教程与示例
  15. 删除参考文献后的空行
  16. Win10笔记本开启热点让手机上网
  17. 使用 keepalived 设置虚拟 IP 环境
  18. MQTT keepalive和reconnect
  19. hids Elastic Security 系列1-Elastic Security介绍
  20. 数年沉寂之后,VR/AR产业开始起飞!

热门文章

  1. HDU2795 billboard【转化为线段树。】
  2. poj 1389 Area of Simple Polygons 线段树扫面线,和1151一样的嘛
  3. windows PC电脑必备3个实用软件
  4. 在苹果Mac中巧用聚焦搜索Spotlight
  5. 苹果Mac侧边栏笔记工具:​​​​​​​​SideNotes
  6. EverWeb for Mac(网页设计软件)
  7. Mac如何设置文本中的单双引号样式?
  8. 技巧:macOS 在 Finder(访达)中查看文件夹大小
  9. idea 配置 maven 和 镜像
  10. Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】