Oracle分区表的层次查询如何才能用到分区?

最近在调优分区表的层次查询时,发现用不到分区,做了一个实验,发现还是可以用的到的,只是写法上有些要求。

drop table test;

create table test

(

id  number primary key,

parent_id number,

name varchar2(20),

code varchar2(4)

)

partition by list(code)

(

partition p1 values(‘0301‘),

partition p2 values(‘0302‘),

partition p3 values(‘0303‘),

partition p4 values(‘0304‘),

partition p5 values(‘0305‘),

partition p6 values(‘0306‘),

partition p7 values(‘0307‘),

partition p8 values(‘0308‘),

partition p_default values (default)

);

insert into test values(1,0,‘a1‘,‘0301‘);

insert into test values(2,1,‘a2‘,‘0301‘);

insert into test values(3,2,‘a3‘,‘0301‘);

insert into test values(4,3,‘a4‘,‘0301‘);

insert into test values(5,0,‘a5‘,‘0302‘);

insert into test values(6,5,‘a6‘,‘0302‘);

insert into test values(7,6,‘a7‘,‘0302‘);

insert into test values(8,7,‘a8‘,‘0302‘);

insert into test values(9,8,‘a9‘,‘0302‘);

insert into test values(10,0,‘a10‘,‘0303‘);

insert into test values(11,0,‘a11‘,‘0304‘);

insert into test values(12,0,‘a12‘,‘0306‘);

insert into test values(13,0,‘a13‘,‘0307‘);

insert into test values(14,0,‘a14‘,‘0308‘);

insert into test values(15,10,‘a15‘,‘0303‘);

insert into test values(16,11,‘a16‘,‘0304‘);

insert into test values(17,12,‘a17‘,‘0306‘);

insert into test values(18,13,‘a18‘,‘0307‘);

insert into test values(19,14,‘a19‘,‘0308‘);

commit;

exec dbms_stats.gather_table_stats(user,‘test‘,cascade => true);

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> set autotrace traceonly

SQL> select * from test t

start with t.id = 12

connect by prior t.id = t.parent_id;

执行计划

----------------------------------------------------------

Plan hash value: 6144290

----------------------------------------------------------------------------------------------------------------

| Id  | Operation                               | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

----------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                        |      |    19 |   798 |    16   (7)| 00:00:01 |       |       |

|*  1 |  CONNECT BY NO FILTERING WITH START-WITH|      |       |       |            |          |       |       |

|   2 |   PARTITION LIST ALL                    |      |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

|   3 |    TABLE ACCESS FULL                    | TEST |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."PARENT_ID"=PRIOR "T"."ID")

filter("T"."ID"=12)

统计信息

----------------------------------------------------------

0  recursive calls

0  db block gets

55  consistent gets

0  physical reads

0  redo size

557  bytes sent via SQL*Net to client

360  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

2  sorts (memory)

0  sorts (disk)

2  rows processed

SQL> select * from test t

start with t.id = 12

and t.code = ‘0306‘

connect by prior t.id = t.parent_id;

执行计划

----------------------------------------------------------

Plan hash value: 6144290

----------------------------------------------------------------------------------------------------------------

| Id  | Operation                               | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

----------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                        |      |    19 |   798 |    16   (7)| 00:00:01 |       |       |

|*  1 |  CONNECT BY NO FILTERING WITH START-WITH|      |       |       |            |          |       |       |

|   2 |   PARTITION LIST ALL                    |      |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

|   3 |    TABLE ACCESS FULL                    | TEST |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."PARENT_ID"=PRIOR "T"."ID")

filter("T"."ID"=12 AND "T"."CODE"=‘0306‘)

统计信息

----------------------------------------------------------

0  recursive calls

0  db block gets

55  consistent gets

0  physical reads

0  redo size

557  bytes sent via SQL*Net to client

360  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

2  sorts (memory)

0  sorts (disk)

2  rows processed

SQL> select * from test t

start with (t.id = 12

and t.code = ‘0306‘)

connect by prior t.id = t.parent_id

and prior t.code = ‘0306‘;

执行计划

----------------------------------------------------------

Plan hash value: 6144290

----------------------------------------------------------------------------------------------------------------

| Id  | Operation                               | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

----------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                        |      |    19 |   798 |    16   (7)| 00:00:01 |       |       |

|*  1 |  CONNECT BY NO FILTERING WITH START-WITH|      |       |       |            |          |       |       |

|   2 |   PARTITION LIST ALL                    |      |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

|   3 |    TABLE ACCESS FULL                    | TEST |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."PARENT_ID"=PRIOR "T"."ID" AND PRIOR "T"."CODE"=‘0306‘)

filter("T"."ID"=12 AND "T"."CODE"=‘0306‘)

统计信息

----------------------------------------------------------

0  recursive calls

0  db block gets

55  consistent gets

0  physical reads

0  redo size

557  bytes sent via SQL*Net to client

360  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

2  sorts (memory)

0  sorts (disk)

2  rows processed

SQL> select * from test t

start with t.id = 12

connect by prior t.id = t.parent_id

and prior t.code = ‘0306‘;

执行计划

----------------------------------------------------------

Plan hash value: 6144290

----------------------------------------------------------------------------------------------------------------

| Id  | Operation                               | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

----------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                        |      |    19 |   798 |    16   (7)| 00:00:01 |       |       |

|*  1 |  CONNECT BY NO FILTERING WITH START-WITH|      |       |       |            |          |       |       |

|   2 |   PARTITION LIST ALL                    |      |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

|   3 |    TABLE ACCESS FULL                    | TEST |    19 |   285 |    15   (0)| 00:00:01 |     1 |     9 |

----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."PARENT_ID"=PRIOR "T"."ID" AND PRIOR "T"."CODE"=‘0306‘)

filter("T"."ID"=12)

统计信息

----------------------------------------------------------

1  recursive calls

0  db block gets

55  consistent gets

0  physical reads

0  redo size

557  bytes sent via SQL*Net to client

360  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

2  sorts (memory)

0  sorts (disk)

2  rows processed

只有下面的写法才能用到分区,可以看到t.code = ‘0306‘是关键

SQL> select * from test t

start with (t.id = 12

and t.code = ‘0306‘)

connect by prior t.id = t.parent_id

and t.code = ‘0306‘;

执行计划

----------------------------------------------------------

Plan hash value: 3571852076

--------------------------------------------------------------------------------------------------------------------

| Id  | Operation                           | Name         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

--------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                    |              |     2 |    84 |     9  (34)| 00:00:01 |    |          |

|*  1 |  CONNECT BY WITH FILTERING          |              |       |       |            |          |    |          |

|*  2 |   TABLE ACCESS BY GLOBAL INDEX ROWID| TEST         |     1 |    15 |     1   (0)| 00:00:01 |  6 |        6 |

|*  3 |    INDEX UNIQUE SCAN                | SYS_C0010758 |     1 |       |     0   (0)| 00:00:01 |    |          |

|*  4 |   HASH JOIN                         |              |     1 |    28 |     6  (17)| 00:00:01 |    |          |

|   5 |    CONNECT BY PUMP                  |              |       |       |            |          |    |          |

|   6 |    PARTITION LIST SINGLE            |              |     2 |    30 |     4   (0)| 00:00:01 |   KEY |   KEY |

|   7 |     TABLE ACCESS FULL               | TEST         |     2 |    30 |     4   (0)| 00:00:01 |  6 |        6 |

--------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."PARENT_ID"=PRIOR "T"."ID")

filter("T"."CODE"=‘0306‘)

2 - filter("T"."CODE"=‘0306‘)

3 - access("T"."ID"=12)

4 - access("connect$_by$_pump$_002"."prior t.id "="T"."PARENT_ID")

统计信息

----------------------------------------------------------

0  recursive calls

0  db block gets

16  consistent gets

0  physical reads

0  redo size

557  bytes sent via SQL*Net to client

360  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

4  sorts (memory)

0  sorts (disk)

2  rows processed

SQL> select t.*, prior id, prior parent_id, prior t.name, prior t.code

from test t

start with t.id = 12

connect by prior t.id = t.parent_id

and  t.code = ‘0306‘;

执行计划

----------------------------------------------------------

Plan hash value: 3043676987

--------------------------------------------------------------------------------------------------------------------

| Id  | Operation                           | Name         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

--------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                    |              |     2 |    84 |     9  (34)| 00:00:01 |    |          |

|*  1 |  CONNECT BY WITH FILTERING          |              |       |       |            |          |    |          |

|   2 |   TABLE ACCESS BY GLOBAL INDEX ROWID| TEST         |     1 |    15 |     1   (0)| 00:00:01 | ROWID | ROWID |

|*  3 |    INDEX UNIQUE SCAN                | SYS_C0010758 |     1 |       |     0   (0)| 00:00:01 |    |          |

|*  4 |   HASH JOIN                         |              |     1 |    28 |     6  (17)| 00:00:01 |    |          |

|   5 |    CONNECT BY PUMP                  |              |       |       |            |          |    |          |

|   6 |    PARTITION LIST SINGLE            |              |     2 |    30 |     4   (0)| 00:00:01 |   KEY |   KEY |

|   7 |     TABLE ACCESS FULL               | TEST         |     2 |    30 |     4   (0)| 00:00:01 |  6 |        6 |

--------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."PARENT_ID"=PRIOR "T"."ID")

filter("T"."CODE"=‘0306‘)

3 - access("T"."ID"=12)

4 - access("connect$_by$_pump$_002"."prior t.id "="T"."PARENT_ID")

时间: 2024-08-14 20:47:04

Oracle分区表的层次查询如何才能用到分区?的相关文章

oracle层次查询

1 定义: 层次查询使用树的遍历,走遍含树形结构的数据集合,来获取树的层次关系报表的方法 树形结构的父子关系,你可以控制: ① 遍历树的方向,是自上而下,还是自下而上 ②  确定层次的开始点(root)的位置 层次查询语句正是从这两个方面来确定的,start with确定开始点,connect by确定遍历的方向  www.2cto.com 2 语法: 注释: ① level是伪列,表示等级 ② from后面只能是一个表或视图,对于from是视图的,那么这个view不能包含join ③ Wher

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') 执

Oracle层次查询和分析函数在号段选取中的应用

转自:http://www.itpub.net/thread-719692-1-1.html 摘要一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查询功能以及分析函数,我们可以很轻松的解决上述问题. 关键词:号段选取.连续数.断点.层次查询.分析函数.connect by.rownum.level.lead.lag 1.        问题的提出在实际工

Oracle——分区表

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51869335,谢谢! 下例中的表设计并不一定,仅作演示使用. 1.概述 即使业务拆分,有时还是不能避免某张表的数据(行数)过多. 当单表数据过多时,会影响整体的性能,查询将变得更慢,数据的备份恢复也会花费更多时间. However,数据库一般都提供了一个将单表拆分成多张表的机制,以更容易的管理表和解决性能问题.这种方式(把表的行分为多个部分)划分表数据的方法就是对表的分区.被分区的表是分区表

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

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

ORACLE 分区表简介

参考链接:http://blog.csdn.net/ziwen00/article/details/9158725ORACLE-分区表 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. 6.表的分区做过改变后索引问题 7.将一个非分区表转换为分区表 (1) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表

oracle分区表按时间自动创建

表分区是一种思想,分区表示一种技术实现.当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO.oracle分区表是oracle数据库提供的一种表分区的实现形式.表进行分区后,逻辑上仍然是一张表,原来的查询SQL同样生效,同时可以采用使用分区查询来优化SQL查询效率,不至于每次都扫描整个表. 根据年: INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))根据月: INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))根据天: INTERVAL(NUMT

Oracle字符集的查看查询和Oracle字符集的设置修改

本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题. 一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台. 影响Oracle数据库字符集最重要的参数是NLS_LANG参数.

oracle数据库的高级查询方法 多表联合查询

oracle查询 一,简单查询 order by 1,2 select t.sno, t.sname, t.ssex from STUDENT t order by 1,2,3 group by 增强版 SELECT p.toma, p.ptype, SUM(p.lastcou) FROM product p GROUP BY rollup(p.toma, p.ptype) 二,高级查询(多表连接查询) 笛卡尔积的概念: 所谓笛卡尔积,通俗点说就是指包含两个集合中任意取出两个元素构成的组合的集合