Oracle Explain plan 使用总结
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.建表
- 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);
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 使用总结的更多相关文章
- 优化器的使用oracle ---explain plan
如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...
- Oracle Explain Plan,hint解释与示例
Oracle 专业dba博客:http://blog.csdn.net/tianlesoftware Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响S ...
- Oracle SQL Developer中查看解释计划Explain Plan的两种方法
方法一: 比如要查看解释计划的SQL是:select * from hy_emp 那么在输入窗口输入: EXPLAIN PLAN FOR select * from hy_emp 之后执行,输出窗口会 ...
- 分析oracle的执行计划(explain plan)并对对sql进行优化实践
基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...
- 【转】Oracle 执行计划(Explain Plan) 说明
转自:http://blog.chinaunix.net/uid-21187846-id-3022916.html 如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQ ...
- Oracle 执行计划(Explain Plan)
如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...
- Oracle执行计划 explain plan
Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...
- 转:Oracle 执行计划(Explain Plan) 说明
Oracle 执行计划(Explain Plan) 说明 原贴地址:http://blog.csdn.net/tianlesoftware/article/details/5827245 如果要分 ...
- oracle用EXPLAIN PLAN 分析SQL语句
EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及 ...
随机推荐
- phpmyadmin4.1.4安装配置教程
phpMyAdmin 就是一种 MySQL 数据库的管理工具,安装该工具后,即可以通过 web 形式直接管理 MySQL 数据,而不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管 ...
- Python 爬取外文期刊论文信息(机械 仪表工业)
NSTL国家科技图书文献中心 2017 机械 仪表工业 所有期刊论文信息 代码比较随意,不要介意 第一步,爬取所有期刊链接 #coding=utf-8 import time from se ...
- 安装PIL的坑
今天在centos中使用pip安装PIL死活不成功,报错: Could not find a version that satisfies the requirement PIL (from vers ...
- java线程总结(1/5)
前言 闲来无事正值面试,看面试中有线程之问题,特此总结一番. 正文 一.线程和进程的区别:1.每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.2.线程可以看成时轻量级的进程 ...
- 自开发实现Quartz Web管理
网上能找到的QuartzWeb管理的资料都是使用的一个国外人写的Quartz WebApp的东东.功能也非常全面. 可是作为自己的应用其有用不了那么多功能,一般我们仅仅要能够定义一个job,指定一个C ...
- Js和html相结合的方式
目录 TOC \o "1-3" \h \z \u js和html相结合的方式. PAGEREF _Toc455386178 \h 1 08D0C9EA79F9BACE118C82 ...
- mysql导入数据乱码的解决
#mysql -uroot -p -hlocalhost --default-character-set=utf8; mysql>use db_name; mysql>source /ho ...
- 第【一】部分Netzob项目工具的安装配置
第[一]部分Netzob项目工具的安装配置 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitp ...
- python小写转大写金额
python小写转大写金额 摘自:http://shine-it.net/index.php?topic=14575.0 def _rmb_upper(self, value): "&quo ...
- Java 内存区域和GC机制(转载)
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...