pg和oracle分区的一些心得

1、oracle和pg都支持两层分区,但是pg可以支持理论上更多层级的子分区,三层、四层甚至更多…… 但是oracle只是支持两层。

2、oracle把表作为一个整体来看待,分区和子分区是属于这个表的逻辑部分,是属于表的各个存储段segment。而pg把表、分区、子分区作为独立的relfilenode来看待,每个分区和子分区可以作为一个单独表来看待,只是他们之间有继承(inherit)关系。

3、基于上述不同的设计,在oracle中查询分区或者子分区,可以select count(*) from tab partition xx subpartition yy来进行,而在pg中可以select count(*) from zzzzz(子分区名)

4、基于oracle是把分区表作为一个逻辑整体来对待,所以在oracle中有global index和local index,唯一索引可以依赖global index实现全局唯一,但是在pg中只有local index,无法保证全局唯一性,需要在应用层进行保证。

5、oracle的表在分析之后,可以即精确到表级,也可以精确到分区和子分区级别,pg的需要analyze到子分区才能获得精确的统计信息。

6、oracle的很多分区操作,都强调表整体的一致性,如exchange partition,split partition,Heat Map等等特性,pg没有exchange语法(注,polardb pg有exchange partition,参考此链接

7、元数据的数据字典:
oracle: DBA_TAB_PARTITIONS, DBA_TAB_SUBPARTITIONS
pg:pg_inherits, pg_class

8、当没有任何能触发分区裁剪的谓词时,优化器在生成聚合路径时会把父表展开成“全部子分区”,导致wrong result。
即pg中执行select count(*) from files partition file_del,查询记录出错,看执行计划,同时扫描了2个父分区。要通过select count(*) from file_del的方式来绕过。

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据