oracle分区表运行计划

分区表有非常多优点,以大化小,一小化了,加上并行的使用,在loap中能往往能提高几十倍甚至几百倍的效果。

当然表设计得不好也会适得其反。效果比普通表跟糟糕。
为了更好的使用分区表,这里看一下分区表的运行计划。
PARTITION RANGE ALL:扫描全部分区
PARTITION RANGE ITERATOR:扫描多个分区,小于全部个分区数量
PARTITION RANGE SINGLE:扫描单一的分区
KEY,表示运行时才知道哪个分区

看到keywordALL的时候就要注意了,扫描的是全部分区。

写sql的时候在where条件中能充分利用分区字段来限制的话最好,这样能起到分区裁剪的作用,不是必需的分区就不用扫描了。

SQL> create table t1
  2  partition by range(created)(
  3  partition p1 values less than (to_date('20140101','yyyymmdd')),
  4  partition p2 values less than (to_date('20140201','yyyymmdd')),
  5  partition p3 values less than (to_date('20140301','yyyymmdd')),
  6  partition p4 values less than (to_date('20140401','yyyymmdd')),
  7  partition p5 values less than (to_date('20140501','yyyymmdd')),
  8  partition p6 values less than (to_date('20140601','yyyymmdd')),
  9  partition p7 values less than (to_date('20140701','yyyymmdd')),
 10  partition p8 values less than (to_date('20140801','yyyymmdd')),
 11  partition p9 values less than (to_date('20140901','yyyymmdd')),
 12  partition p10 values less than (to_date('20141001','yyyymmdd')),
 13  partition p11 values less than (to_date('20141101','yyyymmdd')),
 14  partition p12 values less than (to_date('20141201','yyyymmdd')),
 15  partition p13 values less than (maxvalue)
 16  )
 17  as select * from dba_objects where created>=to_date('20131001','yyyymmdd');

--PARTITION RANGE ALL:扫描全部分区
SQL> explain plan for select count(*) from t1;
-------------------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |     1 |   106   (1)| 00:00:02 |       |       |
|   1 |  SORT AGGREGATE      |      |     1 |            |          |       |       |
|   2 |   PARTITION RANGE ALL|      | 41973 |   106   (1)| 00:00:02 |     1 |    13 |
|   3 |    TABLE ACCESS FULL | T1   | 41973 |   106   (1)| 00:00:02 |     1 |    13 |
-------------------------------------------------------------------------------------

--PARTITION RANGE ITERATOR:扫描多个分区。小于全部个分区数量
SQL> explain plan for select * from t1 where created>=to_date('20141101','yyyymmdd');
-------------------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |      | 13121 |  2267K|    39   (6)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ITERATOR|      | 13121 |  2267K|    39   (6)| 00:00:01 |    12 |    13 |
|*  2 |   TABLE ACCESS FULL      | T1   | 13121 |  2267K|    39   (6)| 00:00:01 |    12 |    13 |
-------------------------------------------------------------------------------------------------

--PARTITION RANGE SINGLE:扫描单一的分区
SQL> explain plan for select * from t1 where created>=to_date('20141217','yyyymmdd');
-----------------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      |   947 |   163K|    28   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE|      |   947 |   163K|    28   (0)| 00:00:01 |    13 |    13 |
|*  2 |   TABLE ACCESS FULL    | T1   |   947 |   163K|    28   (0)| 00:00:01 |    13 |    13 |
-----------------------------------------------------------------------------------------------

--KEY,表示运行时才知道哪个分区
SQL> explain plan for select * from t1 where created>=sysdate-1;
-------------------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |      |   947 |   163K|    33  (16)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ITERATOR|      |   947 |   163K|    33  (16)| 00:00:01 |   KEY |    13 |
|*  2 |   TABLE ACCESS FULL      | T1   |   947 |   163K|    33  (16)| 00:00:01 |   KEY |    13 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("CREATED">[email protected]!-1)

SQL> variable x varchar2;
SQL> explain plan for select * from t1 where created>=to_date(:x,'yyyymmdd');
-------------------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |      |  2099 |   362K|   107   (2)| 00:00:02 |       |       |
|   1 |  PARTITION RANGE ITERATOR|      |  2099 |   362K|   107   (2)| 00:00:02 |   KEY |    13 |
|*  2 |   TABLE ACCESS FULL      | T1   |  2099 |   362K|   107   (2)| 00:00:02 |   KEY |    13 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("CREATED">=TO_DATE(:X,'yyyymmdd'))
时间: 2024-08-04 15:58:58

oracle分区表运行计划的相关文章

[Oracle] 获取运行计划的各方法总结

总的结论: 一.获取运行计划的6种方法(具体步骤已经在每一个样例的开头凝视部分说明了): 1. explain plan for获取: 2. set autotrace on . 3. statistics_level=all; 4. 通过dbms_xplan.display_cursor输入sql_id參数直接获取 5. 10046 trace跟踪 6. awrsqrpt.sql 二.适用场合分析 1.假设某SQL运行很长时间才会出结果.甚至慢到返回不了结果,这时候看运行计划就仅仅能用方法1,

使用hint优化Oracle的运行计划 以及 SQL Tune Advisor的使用

背景: 某表忽然出现查询很缓慢的情况.cost 100+ 秒以上:严重影响生产. 原SQL: explain plan for select * from ( select ID id,RET_NO retNo, FROM_SYS fromSy, TO_SYS toSys, COMMAND_CODE commandCode, COMMAND, STATUS, EXT_CODE, ORIGN_CODE orignCode,error_message errorMessage, RE_F, RET_

查询oracle sql运行计划,一个非常重要的观点--dba_hist_sql_plan

该文章的作者给予了极大的帮助长老枯荣,为了表达我的谢意. 这适用于oracle db版本号oracle 10g或者更高的版本号. 之所以说这种看法是非常重要的,因为观点是有之一awrsqrpt报告没有在.就是 filter_predicates列. SELECT plan_hash_value, TO_CHAR(RAWTOHEX(child_address)), TO_NUMBER(child_number), id, LPAD(' ', DEPTH) || operation operatio

oracle分区表执行计划

分区表有很多好处,以大化小,一小化了,加上并行的使用,在loap中能往往能提高几十倍甚至几百倍的效果.当然表设计得不好也会适得其反,效果比普通表跟糟糕. 为了更好的使用分区表,这里看一下分区表的执行计划. PARTITION RANGE ALL:扫描所有分区 PARTITION RANGE ITERATOR:扫描多个分区,小于所有个分区数量 PARTITION RANGE SINGLE:扫描单一的分区 KEY,表示执行时才知道哪个分区 看到关键字ALL的时候就要注意了,扫描的是全部分区.写sql

深入学习Oracle分区表及分区索引

关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Hash(哈希)分区 •       List(列表)分区 •       以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区

Oracle SQL操作计划基线总结(SQL Plan Baseline)

一.基础概念 Oracle 11g開始,提供了一种新的固定运行计划的方法,即SQL plan baseline,中文名SQL运行计划基线(简称基线),能够觉得是OUTLINE(大纲)或者SQL PROFILE的改进版本号.基本上它的主要作用能够归纳为例如以下两个: 1.稳定给定SQL语句的运行计划.防止运行环境或对象统计信息等等因子的改变对SQL语句的运行计划产生影响! 2.降低数据库中出现SQL语句性能退化的概率.理论上不同意一条语句切换到一个比已经运行过的运行计划慢非常多的新的运行计划上!

【故障处理141119】一次数据库不繁忙时一条sql语句2个运行计划导致业务超时的故障处理

1,故障描写叙述: 一条select有两个运行计划.在sqlplus中运行选择好的运行计划.仅仅要40毫秒.而在程序中运行选择了差的运行计划,要1分23秒左右,导致前台业务超时报错. 2.故障解决: 使用outline固定好的运行计划后攻克了该故障. 3,故障发展顺序: (1),早上一上班,说CRM的一个业务报错,crm应用开发者.接口的.tuxdo.dba集中到一起開始诊断错误. (2),业务返回超时错误 (3),数据库这边抓取AWR报告发现例如以下信息: (4),此时应用开发者也发过来了该条

Oracle SQL执行计划基线总结(SQL Plan Baseline)

一.基础概念 Oracle 11g开始,提供了一种新的固定执行计划的方法,即SQL plan baseline,中文名SQL执行计划基线(简称基线),可以认为是OUTLINE(大纲)或者SQL PROFILE的改进版本,基本上它的主要作用可以归纳为如下两个: 1.稳定给定SQL语句的执行计划,防止执行环境或对象统计信息等等因子的改变对SQL语句的执行计划产生影响! 2.减少数据库中出现SQL语句性能退化的概率,理论上不允许一条语句切换到一个比已经执行过的执行计划慢很多的新的执行计划上! 注意:

oracle分区表查询

ORACLE分区表的查询 假如 [分区表] 在字段 [createdate] 上进行分区,每个月为一个分区: 2009年6月为分区P200906 2009年7月为分区P200907 2009年8月为分区P200908 执行SQL 使用分区键检索: select*from 分区表 t where createdate > to_date('2009-07-12','yyyy-mm-dd') and createdate < to_date('2009-08-12','yyyy-mm-dd') 执