@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は引き続きパーティションの作成を容易にするために、ヘルパー関数partitionおよびpartition_initをデフォルトで提供します。以下のステートメントは、イベントテーブルにのパーティションを作成します。id列に一意のインデックス、when_occurred列にインデックスを作成します。

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

上記により、現在のパーティションと次の3つのパーティションが確実に作成されます。

初期パーティション

一般的に、初期パーティションを作成するためのDDLをextra-ddl.xmlで明示的に指定します。以下の例では、大きな初期パーティションを持つパーティションを作成する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はこれらのパーティションを自動的に作成しなくなります。