Oracle的分区是一个经常被使用的功能,在OLTP业务中,对于数据量上亿的表是非常有效率的。在分区表中分区裁剪的特性更是将大表查询做到了性能上的极致。
分为静态和动态:简单理解条件为静态值时为静态裁剪,为动态值时为动态裁剪。
动态的情况可有以下几种情况:
- 绑定变量值
- 分区修剪的条件来至一个子查询的结果
- 优化器利用星型转换重写了查询,而分区修剪发生在转换以后
- 最有效的执行计划是一个NESTED LOOP
是否用到分区裁剪,主要看执行计划中pstart,pstop值得范围。可通过explain plan for
- 分区键如果用表达式或者函数,则不会走分区裁剪。这是pstart,pstop的值将会是是所有分区~
1
2
3
4
5
6
7
|
create table t_local01 partition by range(object_id)
(partition p1 values less than(10000),
partition p2 values less than(20000),
partition p3 values less than(30000),
partition p4 values less than(40000),
partition p5 values less than(maxvalue))
as select * from dba_objects;
|
1
|
create index ind1 on t_local01(data_object_id) local;
|
1
2
3
4
|
explain plan for select * from t_local01
where object_id>=25000 and object_id <=28000 and data_object_id=29;
select * from table(dbms_xplan.display());
|