在已分区表中,一个逻辑上的大表划分为多个更小的物理块。分区可以提供多项好处:

  • 在某些情况下可以大幅度提高查询性能,尤其是当表的大多数频繁访问的行位于单个分区或少量分区中时。分区允许您省略索引前面的分区列,从而减小索引大小并使大量使用的索引部分更可能装入内存中。
  • 当查询或更新命令访问单个分区的很大比例时,性能可能会有所提高,因为服务器将对分区进行顺序扫描,而不是使用索引和分散在整个表中的随机存取读取。
  • 可以通过添加或删除分区来实现批量加载(或卸载)(如果您计划将该要求纳入分区设计中)。ALTER TABLE 远远快于批量操作。它还可完全避免批量 DELETE 所引起的 VACUUM 开销。
  • 很少使用的数据可以迁移到较便宜(或较慢)的存储介质。

仅当表非常大时,才值得进行表分区。表受益于分区的确切点取决于应用程序;好的做法是表的大小应超过数据库服务器的物理内存。

本文档讨论与 POLARDB for Oracle 支持的 Oracle 数据库兼容的表分区的相关方面。

本文档,尤其是本章中介绍的分区并不介绍声明式分区功能,该功能是在 PostgreSQL 10 版中引入的。请注意,除了本章中介绍的与 Oracle 数据库兼容的表分区外,POLARDB for Oracle 10 还支持 PostgreSQL 声明式分区。有关声明式分区的信息,请参阅 PostgreSQL 核心文档,网址为:https://www.postgresql.org/docs/11/static/ddl-partitioning.html

Oracle 样式的已分区表不支持 PostgreSQL 9.6 INSERT… ON CONFLICT DO NOTHING/UPDATE 子句(通常称为 UPSERT)。如果在调用 INSERT 命令来向已分区表添加数据时包括 ON CONFLICT DO NOTHING/UPDATE 子句,则服务器会返回错误。