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. jQuery匹配各种条件的选择器用法

    :hidden匹配所有的不可见元素,input 元素的 type 属性为 "hidden" 的话也会被匹配到Matches all elements that are hidden ...

  2. 预防U盘被病毒侵害的方法

    写在前面:此方法只能杜绝自己的u盘免收侵害,而不能杜绝自己的电脑免收其他u盘病毒的侵害,如果想知道如何让自己的电脑防止被u盘病毒侵害,可以阅读此文章:https://www.cnblogs.com/t ...

  3. 流畅的python第十章序列的修改,散列和切片学习记录

    只要实现了__len__和__getitem__两个方法即可将该类视为序列. 切片原理 动态存取属性 如果实现了__getattr__方法,也要定义__setattr__方法,以防对象行为不一致

  4. 关于RECOVERY清除数据的分析

    [前言] 讨论:双清和清空所有数据的问题 说明:以前写的帖子都写三清,那个是为了保险起见才叫大家三项清除,毕竟人都有刚开始的时候,但看了郭贤普的帖子<系统与数据兼容性测试>之后,我觉得有必 ...

  5. Item 33: 避免覆盖(hiding)“通过继承得到的名字”

    莎士比亚有一个关于名字的说法."What's in a name?" 他问道,"A rose by any other name would smell as sweet ...

  6. sqlmap dvwa SQL Injection使用小记

    刚刚开始学习sql injection,初步使用sqlmap,使用 GET http://www.dvssc.com/dvwa/vulnerabilities/sqli/?id=1&Submi ...

  7. Android 常见内存泄漏的解决方式

    在Android程序开发中.当一个对象已经不须要再使用了,本该被回收时.而另外一个正在使用的对象持有它的引用从而导致它不能被回收.这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了. ...

  8. Win7如何删除家庭组

    发表于 2010-07-15 11:38:06 [YY团]Win7家庭组不能正常使用的解决办法 只是把近期碰到的一个小毛病的解决方案共享一下罢了,估计碰到这问题的人不会很多-- 表现是家庭组不能正常访 ...

  9. 使用Kotlin创建Android项目

    如果你已经使用过Android Studio和Gradle,那么这一章会比较简单.我不会给出很多细节和截图,因为用户界面和细节可能会一直变化. 我们的应用是由一个简单的天气app组成,正如所使用的Go ...

  10. canvas贝济埃曲线

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...