EDB和Oracle在分区剪裁实践上的一点差别

前两天碰到一个问题,在EDB数据库中创建的一张分区表,需要使用分区本地索引和分区剪裁,但查看执行计划发现没能用到分区剪裁的功能。

创建分区表:

CREATE TABLE test
(
  id bigint NOT NULL,
  bag_id bigint,
  bp_airline_code character varying(3),
  bp_flight character varying(5),
  bp_flight_suffix character varying(2),
  bp_flight_date timestamp with time zone,
  CONSTRAINT pk_test PRIMARY KEY (id)
)
partition by range(bp_flight_date)
(
    partition part_20151101 VALUES LESS THAN('2015-NOV-02'),
    partition part_20151102 VALUES LESS THAN('2015-NOV-03'),
    partition part_20151103 VALUES LESS THAN('2015-NOV-04')
);

创建主表和三个分区的本地索引:

CREATE INDEX test_idx_01
    ON test
    (bag_id, bp_airline_code, bp_flight, bp_flight_suffix);

CREATE INDEX test_part_20151101_idx
    ON test_part_20151101
    (bag_id, bp_airline_code, bp_flight, bp_flight_suffix);

CREATE INDEX test_part_20151102_idx
    ON test_part_20151102
    (bag_id, bp_airline_code, bp_flight, bp_flight_suffix);

CREATE INDEX test_part_20151103_idx
    ON test_part_20151103
    (bag_id, bp_airline_code, bp_flight, bp_flight_suffix);

执行以下带有分区键的查询语句,:

explain select * from test
where bp_flight_date=to_date('2015-11-01', 'yyyy-mm-dd') and bag_id = 1

发现并没有使用到分区剪裁:

有点疑惑,明明用了分区键作为查询条件,为什么此处是扫描了所有分区?

分析
其实这个问题说简单也简单,说麻烦也麻烦,主要还是细节和原理的理解。
上例中使用的分区规则是:

partition by range(bp_flight_date)
(
    partition part_20151101 VALUES LESS THAN('2015-NOV-02')
...

以bp_flight_date日期字段作为分区键,条件是LESS THAN(‘2015-NOV-02’)。但执行的查询语句条件是:

where bp_flight_date=to_date('2015-11-01', 'yyyy-mm-dd') and bag_id = 1

对日期值是使用了to_date函数,并不是像分区规则中的“字符串”格式,有理由怀疑是因为两者不统一,由于某些RULE导致未能用到分区剪裁的功能。

接下来按照猜想改下查询条件:

explain select * from test
where bp_flight_date='2015-11-01', 'yyyy-mm-dd' and bag_id = 1

查看执行计划:

现在已经只扫描test_part_20151101这个分区,达到了分区剪裁的目的。

之所以有上面这些问题,可能还是源于Oracle的一些思维,在Oracle,意识当中将日期字段作为查询条件就应该使用to_date()这类的函数

和上面相同的表结构在Oracle中的实现:


这里看到执行计划显示还是用到了分区特性,并没有执行全表扫描,其中Pstart和Pstop显示的是KEY,表示是基于函数值的分区键。

那么像EDB这样创建一个不用to_date函数的分区表:

直接报错了,提示字段类型不匹配,无法创建表。这也说明了在日期字段类型上,EDB和Oracle的一点不同。

总结
1. EDB中分区键是日期字段,VALUES LESS THAN(‘2015-11-01’)可以使用字符串格式,但Oracle则会报ORA-01861的错误,不支持这种创建方式。
2. EDB对使用分区键的查询语句,如果日期条件的格式和分区规则中不同,例如分区规则是’2015-NOV-01’或’2015-11-01’,但查询条件使用to_date(‘2015-11-01’,’yyyy-mm-dd’),则不会用到分区剪裁的特性,而是扫描所有分区。对于Oracle,在创建分区规则时就已经做了严格限制,因此不存在日期条件的格式和分区规则中不一致的情况。这两种方式说不上孰好孰坏,EDB是更自由,但需要人为注意书写的正确,Oracle则是严谨,好处是避免了人为使用出错的可能,间接上可能也反映出了“社区 VS 商业”、“开源 VS 闭源”对待某个问题的一种态度。

时间: 2024-10-11 17:54:16

EDB和Oracle在分区剪裁实践上的一点差别的相关文章

关于ORACLE MYSQL在非前缀分区索引上分区剪裁的比较

ORACLE: CREATE TABLE testpur (i NUMBER, j NUMBER , f varchar2(20))      PARTITION BY RANGE(i)         (PARTITION p1 VALUES LESS THAN (10),          PARTITION p2 VALUES LESS THAN (20),          PARTITION p2 VALUES LESS THAN (30),          PARTITION p2

ORACLE的分区与索引

oracle的分区和索引可以说是它自己的亮点,可能你会说在其他数据库上也有,嗯是的,但oracle的种类性能便利性可以说是比较人性化的,下面我们通过实验来阐述它们的特性和功能. 1.分别给出一个B-tree索引针对全表扫描性能高和低的例子. 索引定义:oracle数据库中索引就是为了加快数据访问速度的一种目录结构 B-tree索引特点: (1)二叉树结构 (2)用比较大小方式查找索引块 (3)适合创建在键值重复率低的字段 例如  主键字段:强调表的参照关系,即可以被外键引用 唯一性约束字段:强调

Oracle Partition 分区详细总结

原作者:    润明 2012-2-1  QQ:226399587  原帖地址:http://blog.csdn.net/runming918   此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. 一.表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间. 分区表:当表中的数据量不断增大,查询数据

oracle表空间表分区详解及oracle表分区查询使用方法_oracle

此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分区表的概念2.表分区的具体作用3.表分区的优缺点4.表分区的几种类型及操作方法5.对表分区的维护性操作.(1.) 表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间. 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间

系统-ORACLE 装在SSd硬盘上载入速度会提升吗?

问题描述 ORACLE 装在SSd硬盘上载入速度会提升吗? 在学习ORACLE ,笔记本上装了11G企业版,开机2分钟,然后因为是win8系统,用一度时间后,硬盘读盘频繁,于是就计划添加SSd,想把oracle载入提升一下,就是不知道效果如何,特来请教! 现在笔记本 i5 3210,8G内存,500G硬盘.12年的10月份的本. 解决方案 加装固态硬盘当然是可以的

电脑修改了磁盘分区后,上不了linux了,一直在字符界面

问题描述 电脑修改了磁盘分区后,上不了linux了,一直在字符界面 电脑修改了磁盘分区后,上不了linux了,一直在字符界面,求助啊... 解决方案 你可以试试这个,我之前也遇到和你一样的问题,直接在字符界面操作就好了http://blog.csdn.net/ZSGG_ACM/article/details/46825803 解决方案二: 你用的是什么引导器,如果是grub,修复下http://blog.chinaunix.net/uid-27037833-id-3235145.html 解决方

oracle11g-求数据库高手,关于oracle表分区的

问题描述 求数据库高手,关于oracle表分区的 现在项目有一个表,数据累计了1亿多条了,查询特别慢,问了公司的老员工,他们说分表,请问现在能分表吗,最好能给个步骤 解决方案 http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_7002.htm 在这个链接里面搜索"Partitioning Examples",在比较下面的位置.有各种例子,你可以看看哪个适用于你的情况

Oracle性能究极优化 上第1/2页_oracle

正在看的ORACLE教程是:Oracle性能究极优化 上. Linux Journal 发表了一篇优化 Oracle 数据库的文章,感觉十分的有用.简要介绍其摘要和大家共同分享 Linux 在企业级数据库上应用. 目前,HP,Compaq,Dell,IBM 以及 Oracle 都在加快速度拥抱 Linux ,这个开放源码的操作系统.根据 eWeek 的统计,去年 Linux 服务器的销售量大约占据了 Compaq 的 30%,Dell 的 13.7%,IBM 的 13.5%.而且 IBM 200

Oracle回收站及flashback drop(上)

Oracle回收站及flashback drop(上)   一.1  BLOG文档结构图 Oracle回收站及flashback drop - 3 - 1.1 BLOG文档结构图 - 3 - 1.2 前言部分 - 3 - 1.2.1 导读和注意事项 - 3 - 1.2.2 相关参考文章链接 - 4 - 1.2.3 本文简介 - 4 - 1.3 相关知识点扫盲(摘自网络+个人总结) - 5 - 1.3.1 闪回 - 5 - 1.3.2 闪回技术分类 - 6 - 1.3.3 闪回删除(Flashba