@DbPartition

目前这仅适用于Postgres 10

我们可以指定常见的划分范围,例如天、周、月和年。这将生成适当的 DDL 并提供一些支持功能,以便更轻松地维护划分。

@DbPartition(mode = PartitionMode.MONTH, property = "whenOccurred")
@Entity
public class Event extends Model {
  ...

Postgres DDL

  • 表 DDL 使用partition by range
  • Ebean 提供帮助程序函数来创建划分
  • 执行 CREATE ALL DLL(即测试)时,Ebean 将检查划分并创建一些不存在的划分
create table event (
  id                            bigserial not null,
  name                          varchar(255) not null,
  when_occurred                 timestamptz not null
  ...
) partition by range (when_occurred);

创建划分

默认情况下,Ebean 提供帮助程序函数partitionpartition_init,以便更轻松地创建后续划分。以下语句在事件表上创建划分。它将在 id 列上创建一个唯一索引,并在 when_occurred 列上创建一个索引。

select partition('week','event','id','when_occurred',3)

上述语句确保创建当前划分和接下来的 3 个划分。

初始划分

通常,我们将在extra-ddl.xml中明确指定一些 DDL 来创建初始划分。以下示例使用partition_init创建具有较大初始划分的划分。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<extra-ddl xmlns="http://ebean-orm.github.io/xml/ns/extraddl">

  <ddl-script name="1 initial partitions" >
select partition_init(date '2015-01-01', 'week', 'event', 'id', 'when_occurred', 3);
select partition_init(date '2015-01-01', 'month', 'event_log', 'id', '', 2);
  </ddl-script>

</extra-ddl>

当我们不指定任何初始划分时,Ebean 将检测到没有划分,并在执行create all ddl时为我们创建一些划分。当这种情况发生时,我们将在日志中看到如下消息。

12:18:47.711 [main] INFO  i.e.dbmigration.DdlGenerator - No table partitions for table event
12:18:47.711 [main] INFO  io.ebean.DDL - Executing initial table partitions - 1 statements
12:18:47.711 [main] DEBUG io.ebean.DDL - executing 1 of 1 select partition('week','event','id','when_occurred',1)

一旦我们在 extra-ddl 中明确指定如何创建初始分区,Ebean 将不再自动创建这些分区。