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

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

前两天碰到一个问题,在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 闭源”对待某个问题的一种态度。

目录
相关文章
|
存储 Oracle 关系型数据库
Oracle海量数据优化-02分区在海量数据库中的应用-更新中
Oracle海量数据优化-02分区在海量数据库中的应用-更新中
121 0
|
SQL 存储 Oracle
Oracle海量数据优化-01分区的渊源
Oracle海量数据优化-01分区的渊源
62 0
|
存储 SQL 监控
实践笔记:Oracle-表按天分区
实践笔记:Oracle-表按天分区
164 0
|
人工智能 Oracle 关系型数据库
阿里云宣布与数据库厂商EnterpriseDB(EDB)达成深度合作 提供优秀的Oracle兼容性
自2015年起,阿里云已经与EnterpriseDB公司就云数据库产品进行业务合作,基于阿里云飞天架构及EDB Postgres Advanced Server推出 云数据库PPAS版。针对Postgres市场的持续升温,阿里云将与EDB公司加强源代码级别的技术合作,为全球用户提供基于云计算架构,更优秀的Postgres云数据库服务及产品。
4349 0
|
运维 Oracle 容灾
云MSP服务案例|云上Oracle RAC部署运维及实践
云数据库产品越来越多,各家云厂商也都推出基于开源MySQL、Postgre等的关系型数据库产品,多副本、高可用、读写分离、分库分表等功能更是集成在各类产品中,降低了机房建设和运维成本,助力更多的客户上云。
998 0
云MSP服务案例|云上Oracle RAC部署运维及实践
|
SQL 存储 Oracle
PostgreSQL , EDB EPAS PPAS(兼容Oracle) , Oracle 对比(兼容性、特性优劣势) - 企业去O,去IOE
标签 PostgreSQL , PPAS , EPAS , edb , enterprisedb , Oracle , 兼容性 , 优缺点 背景 EPAS为EDB的PostgreSQL Oracle兼容企业版,基于PostgreSQL社区版本开发,2004年发布了第一个Oracle兼容版,已经在ORACLE兼容性上耕耘了15年。 2018年推出EPAS 11 版本,完成了 Oracle
2164 0
|
SQL Oracle 关系型数据库
Oracle 11g on ECS 测试实践--安装案例
参考文档:MOS Doc ID 472408.1基于 AMERICAN_AMERICA.US7ASCII 字符集 [oracle@orcl1 schema]$ cd /u01/app/oracle/product/11.
1020 0
|
SQL 弹性计算 Oracle
Oracle 11g on ECS 测试实践--DB篇
我通过脚本和RMAN克隆两种方法创建数据库一.通过SQL创建数据库参考文档1.创建pfile [oracle@orcl1 dbs]$ cd /u01/app/oracle/product/11.2.0/db_1/dbs [oracle@orcl1 dbs]$ cat bak.
826 0