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. Delphi 资源文件( .res)

    一.    现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用.资源是 ...

  2. javaWeb中RSA的加密使用

    加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下. 先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想 ...

  3. 动态加入改动删除html表格内容

    1.需求 须要实现收银台上加入改动删除商品信息时顾显能够实时看到其变化 2.解决 收银台和顾显通过tcp传输进行数据通信,顾显通过操作html中的表格进行数据加入改动和删除操作 3.代码 mytest ...

  4. 【转】C语言中不同的结构体类型的指针间的强制转换详解

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  5. 网页制作,网站制作中put和get的区别

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

  6. tomcat中server.xml配置详解(转载)(三)

     转载自:https://www.cnblogs.com/starhu/p/5599773.html 一. <Engine>元素 每个Service元素只能有一个Engine元素.处理在同 ...

  7. Remove all your local git branches but keep master

    Sometimes after a sprint, all the remaining branches are just taking up space. Here's a small snippe ...

  8. Python中的关键字的用法

    Python有哪些关键字 -Python常用的关键字 and, del, from, not, while, as, elif, global, or, with, assert, else, if, ...

  9. PHP投票实现24小时间隔投票

    l  设置cookie,浏览器都有禁用或者清除cookie的功能 l  设置session,关闭浏览器就没了 所以,我们只能尽量防止重复投票现象 session_start(); //获取ip地址 i ...

  10. js实现全选,全不选,反选

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...