Oracle Explain plan使用总结



   写多了SQL语句,伴随着数据量的海增,总会遇到性能的问题。在Oracle领域一个不好的习惯,一旦遇到性能问题就推给DBA来做。长期如此,反而对DBA的工作感到神秘。至少笔者所在单位就是如此,DBA向来是牛气冲天的。


   要调整SQL语句的性能,就得知道这条SQL语句花费了多少COST。Explain plan工具可帮我们分析这些工作。而调整SQL语句的性能,肯定要涉及索引了。Oracle索引比较常用的有二种,1.B-TREE索引,B-TREE 适用于值变化较多的列,2.BITMAP索引。BITMAP适用于值变化较少的列(少于300个值),比如:性别这样的列。


    有了上述基础就可以开始优化工作了。工具:pl/sql developer。



1.建表

  1. create table HEK_TEST_IN
  2. (
  3. PID   INTEGER primary key,
  4. NDATE DATE,
  5. NNOTE VARCHAR2(50)
  6. )
  7. create table HEK_TEST_INDETAIL
  8. (
  9. PID   INTEGER not null,
  10. FID   INTEGER,
  11. NNAME VARCHAR2(50),
  12. NQTY  FLOAT,
  13. NNOTE VARCHAR2(50),
  14. NSIZE VARCHAR2(20)
  15. );
  16. alter table HEK_TEST_INDETAIL
  17. add constraint FK_TEST_1 foreign key (FID)
  18. references HEK_TEST_IN (PID);
  19. create index HEK_TEST_INDETAIL_INDEX on HEK_TEST_INDETAIL (NNAME, NSIZE);
create table HEK_TEST_IN
(
PID INTEGER primary key,
NDATE DATE,
NNOTE VARCHAR2(50)
)
create table HEK_TEST_INDETAIL
(
PID INTEGER not null,
FID INTEGER,
NNAME VARCHAR2(50),
NQTY FLOAT,
NNOTE VARCHAR2(50),
NSIZE VARCHAR2(20)
);
alter table HEK_TEST_INDETAIL
add constraint FK_TEST_1 foreign key (FID)
references HEK_TEST_IN (PID);
create index HEK_TEST_INDETAIL_INDEX on HEK_TEST_INDETAIL (NNAME, NSIZE);

2.测试具体SQL语句到底有没有使用index。

  2.1条件查询:

      select *  from hek_test_in where pid=3

  Explain Paln输出;

SELECT STATEMENT, GOAL = CHOOSE                  

TABLE ACCESS BY INDEX ROWID    Object owner=APPS    Object name=HEK_TEST_IN        


  INDEX UNIQUE SCAN    Object owner=APPS    Object name=SYS_C00211467 



分析得出:hek_test_in查询时使用索引扫描,为什么呢?因为我们创建表时,指定Primary Key时,Oracel会自动创建一个UNIQUE INDEX。       


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



  2.2连接查询:

      select * from hek_test_in a,hek_test_indetail b where a.pid=b.fid;

  Explain Paln输出;

  SELECT STATEMENT, GOAL = CHOOSE                  

   NESTED LOOPS                  

  TABLE ACCESS FULL    Object owner=APPS    Object name=HEK_TEST_INDETAIL          


  TABLE ACCESS BY INDEX ROWID    Object owner=APPS    Object name=HEK_TEST_IN       


   INDEX UNIQUE SCAN    Object owner=APPS    Object name=SYS_C00211467   

  分析得出:hek_test_in查询时使用索引扫描,而HEK_TEST_INDETAIL使用全表扫描。    

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

   2.3组合索引的条件查询:

      select *  from hek_test_indetail where nname = ''

   Explain Paln输出;

SELECT STATEMENT, GOAL = CHOOSE                  

TABLE ACCESS BY INDEX ROWID    Object owner=APPS    Object name=HEK_TEST_INDETAIL  


  INDEX RANGE SCAN    Object owner=APPS    Object name=HEK_TEST_INDETAIL_INDEX   


分析得出:查询时使用组合索引扫描。注:组合索引跟创建的列顺序有关,如果条件语句换成where nsize='',也会导至全表扫描。

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

  2.4组合索引的排序查询:

      select *  from hek_test_indetail order by nname

   Explain Paln输出;

SELECT STATEMENT, GOAL = CHOOSE                  

SORT ORDER BY                  

  TABLE ACCESS FULL    Object owner=APPS    Object name=HEK_TEST_INDETAIL          


分析得出:排序查询时无法使用组合索引,从而导致全表扫描。



  2.5 基于NULL条件查询:

   select *  from hek_test_indetail where nname is null

   Explain Paln输出;

SELECT STATEMENT, GOAL = CHOOSE                  

TABLE ACCESS FULL    Object owner=APPS    Object name=HEK_TEST_INDETAIL          


分析得出:NULL查询导致全表扫描。与此类似的还有is not null,<>也会导至全表扫描。

本文转自:http://sakyone.iteye.com/blog/618821

Oracle Explain plan 使用总结的更多相关文章

  1. 优化器的使用oracle ---explain plan

    如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...

  2. Oracle Explain Plan,hint解释与示例

    Oracle 专业dba博客:http://blog.csdn.net/tianlesoftware Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响S ...

  3. Oracle SQL Developer中查看解释计划Explain Plan的两种方法

    方法一: 比如要查看解释计划的SQL是:select * from hy_emp 那么在输入窗口输入: EXPLAIN PLAN FOR select * from hy_emp 之后执行,输出窗口会 ...

  4. 分析oracle的执行计划(explain plan)并对对sql进行优化实践

    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

  5. 【转】Oracle 执行计划(Explain Plan) 说明

    转自:http://blog.chinaunix.net/uid-21187846-id-3022916.html       如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQ ...

  6. Oracle 执行计划(Explain Plan)

    如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...

  7. Oracle执行计划 explain plan

    Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...

  8. 转:Oracle 执行计划(Explain Plan) 说明

    Oracle 执行计划(Explain Plan) 说明 原贴地址:http://blog.csdn.net/tianlesoftware/article/details/5827245   如果要分 ...

  9. oracle用EXPLAIN PLAN 分析SQL语句

    EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及 ...

随机推荐

  1. .NET MVC 验证码

    .NET MVC 验证码

  2. Gpu driven rendering pipelines & bindless texture

    http://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.p ...

  3. sublime text 2中“ctrl + `”快捷键无效

    之前sublime 使用正常,这次在装插件的时候,发现ctrl + `快捷键失效了,无法调出控制台. 然后就一直按这两个键,肯定是被别的占用了,所以就像看看有啥反应,看了半天都没有见到什么神奇的窗口跳 ...

  4. JMeter 六:Listener

    参考:http://jmeter.apache.org/usermanual/listeners.html Listener是用来展示Sampler结果的元件. 结果可以被展示在树.表格.图表或者简单 ...

  5. 【MVC5】日期选择控件DatePicker

    项目中使用了Bootstrap,日期控件就选择了依赖于bootstrap的DatePicker. 在App_Start\BundleConfig.cs中引用css和js文件: bundles.Add( ...

  6. CSS 盒状模型简介

    框的构成以及相关 CSS 特性( property ) 结构 为了给文档树中的各个元素排版定位(布局),浏览器会根据渲染模型1为每个元素生成四个嵌套的矩形框, 分别称作 content box.pad ...

  7. sql查询备份或还原等操作的大概完成时间

    查询出来的还需完成时间还算比较准确 --查询备份或还原等操作的大概完成时间 select command ,percent_complete ,running_time))+' hour, ' ))+ ...

  8. 【VBA编程】10.自定义集合

    自定义集合类型,类似于变量声明,只是要将Dim关键字和New collection关键字搭配起来使用,其语法描述如下:其中集合名的命名方式同于标准变量的命名 Dim 集合名 As New collec ...

  9. Visual studio之C#跨线程调用UI控件

    背景 当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录. 正文 定义控件 ...

  10. 基于shiro+jwt的真正rest url权限管理,前后端分离

    代码地址如下:http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+j ...