深入原理:分区剪裁特性剖析

小鱼(邓秋爽)

云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化,SQL优化和troubleshooting

编辑手记:深入学习分区表的特性,更好地设计分区表的表结构

做表结构设计时我们经常会将大表做分区或者分表规划,oracle数据库中由于非常强大的分区功能可以不用分表的办法而直接使用分区表来规划,而我们使用分区表一个很重要的特性就是分区裁剪,这里将对分区表的分区裁剪简单的分析和探究:

分区剪裁就是对于分区表或者分区索引来说,优化器可以自动从from和where中根据分区键直接提取出需要访问的分区,从而避免扫描所有的分区,降低了IO请求。分区剪裁可以细分为静态分区剪裁和动态分区剪裁,其中静态分区剪裁发生在sql语句编译阶段,而动态分区剪裁则发生在sql语句执行阶段,对于分区键是常量值优化器在会走静态分区剪裁的,如果分区键是变量形式优化器只会走动态分区剪裁。

静态分区剪裁:

执行计划

统计信息:

Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 1665 bytes sent via SQL*Net to client 509 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processed

静态分区剪裁中pstart和pstop都是具体的分区编号值,比如这里分区剪裁就是走编号31的分区

动态分区剪裁:

我们来看执行计划

动态分区剪裁执行计划中pstart、pstop都是key的形式,这里扫描的分区无法确定,因为有变量的因素导致无法确定recdate分区键的范围,所以这里的pstart和pstop都是key形式

上面动态分区剪裁中:表CS_CUST_ORDER是以region+recdate的range分区,sql语句中由于只有region条件是静态值,而recdate是绑定变量的形式,优化器这里走的分区剪裁分为两部分:通过region条件的谓词走静态分区剪裁;通过recdate条件的谓词走动态分区剪裁。

静态分区剪裁和动态分区剪裁在IO性能上是否有差异:

执行计划

统计信息如下:

Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 1665 bytes sent via SQL*Net to client 509 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processed

这里看出来静态和动态分区剪裁在IO性能上并没有差异。

如果分区键被用作表达式或者函数运算,将导致优化器无法走分区剪裁,这个跟索引列被用作表达式或者函数运算一样:

SQL> create table t_local01 partition by range(object_id) 2 (partition p1 values less than(10000), 3 partition p2 values less than(20000), 4 partition p3 values less than(30000), 5 partition p4 values less than(40000), 6 partition p5 values less than(maxvalue)) 7 as select * from dba_objects; Table created. SQL> create index ind_dataobjid on t_local01(data_object_id) local; Index created. SQL> select * from t_local01 where object_id<10000 and data_object_id=110;

我们来看执行计划:

(1)

(2)

(3)

(4)

------The end

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-08-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java Edge

zookeeper分布式锁1 分布式锁的概念与数据最终不一致性的场景zookeeper分布式锁小结

随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景,而在分布式...

2021
来自专栏GreenLeaves

Oracle 锁机制

本文参考自:ORACLE锁机制 1、oracle是一个多用户使用的共享资源,当多个用户并发的操作同一数据行时,那么在oracle数据库中就会存在多个事务操作统一...

1949
来自专栏Android相关

ReentrantLock中的unlock流程

在调用到ReentrantLock的unlock方法的时候,无论公平锁与非公平锁都会调用到sync.release(1)方法。

874
来自专栏技术小站

Python 多线程与多进程

原文地址:http://www.cnblogs.com/whatisfantasy/p/6440585.html

872
来自专栏Jed的技术阶梯

Kafka 新版消费者 API(一):订阅主题

说明:这两个参数分别指定了 TCP socket 接收和发送数据包的缓冲区大小。如果它们被设为 -1,就使用操作系统的默认值。如果生产者或消费者与 broker...

1762
来自专栏noteless

-1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),

java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法...

784
来自专栏Java帮帮-微信公众号-技术文章全总结

Java并发学习2【面试+工作】

  关键字synchronized的作用是实现进程间的同步。它的工作是对同步的代码加锁,使得每一次,只能有一个线程进入同步块,从而保证线程间的安全性(即同步块每...

852
来自专栏desperate633

Java并发之Slipped conditions什么是Slipped conditions一个关于Slipped conditions的具体例子

所谓Slipped conditions,就是说, 从一个线程检查某一特定条件到该线程操作此条件期间,这个条件已经被其它线程改变,导致第一个线程在该条件上执行了...

611
来自专栏一个会写诗的程序员的博客

【Java 并发】 之 AQS 详解 & volatile关键字CPU内存架构volatile关键字的作用

谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!

793
来自专栏Java面试笔试题

Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?

sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,...

725

扫码关注云+社区