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. 微软对外披露两个0day漏洞详情

    微软近日对外披露了两个0day漏洞详情,其中一个漏洞存在Adobe阅读器中,可被利用导致任意代码执行:另一个漏洞则允许任意代码在Windows kernel内存中提权执行. 微软称由于该漏洞利用目前还 ...

  2. VMware Workstation 重启服务脚本 解决连不上ssh问题

    解决虚拟机,每次启动连不上ssh问题,需要关闭虚拟机,再执行脚本.执行完后,再启动虚拟机就可以连上ssh啦! 脚本名称:vmware_server_restart.bat (请以管理员身份运行,否则可 ...

  3. centos使用密钥替换密码登录服务器

    一.首先登陆centos,切换用户,切换到你要免密码登陆的用户,进入到家目录,以下我以admin为例,命令:su admincd ~ 二.创建钥匙,命令:ssh-keygen -t rsa,一路按Y搞 ...

  4. Json.net说法——(一)修饰标签,日期序列化

    摘自: http://www.cnblogs.com/jams742003/archive/2009/12/24/1631587.html 通过属性标签自定义JSON序列化 JsonObjectAtt ...

  5. 784 - Maze Exploration

    #include <stdio.h> #include <string.h> char maze[50][100]; void search(int i,int j) { if ...

  6. .NET-DataColumn.DataType 属性

    public DataTable MakeDataTable(){ DataTable myTable; DataRow myNewRow; // Create a new DataTable. my ...

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

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

  8. Win7 64位 IIS未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项

    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正 解决方案: 1.需要在IIS里设置,启用32位应用程序我用的是iis7 把启用32位应用程序的fals ...

  9. 爪哇国新游记之二----用于计算三角形面积的Point类和TAngle类

    这次尝试用两个类完成一个面积计算任务: Point类代表平面上的点: public class Point { private float x; private float y; public Poi ...

  10. 用filter:grayscale将图片过滤成灰色

    设置成百分之百直接过滤成灰色: img{filter:gray; filter:grayscale(100%); -0-filter:grayscale(100%); -moz-filter:gray ...