在 Postgres Aurora 上使用索引和散列分区的 DDL

DDL with Index and Hash Partition on Postgres Aurora

您好,我正在尝试在 OBJECT_ID 上使用散列分区在 PostgreSQL Aurora 中创建 DDL。 我还想在 CUSTOMER_ID,OBJECT_TYPE,OBJECT_ID,PT_EVENT_ID

上创建一个索引
CREATE TABLE event_test(
   ID varchar(255) PRIMARY KEY NOT NULL,
   VERSION int(11) NOT NULL,
   ORDER_TYPE varchar(255) NOT NULL,
   EVENT_TYPE varchar(255) NOT NULL,
   CUSTOMER_ID varchar(255) DEFAULT NULL,
   DETAILS text,
   OBJECT_TYPE varchar(255) NOT NULL,
   UTC_DATE_TIME date DEFAULT NULL,
   EVENT_TO_UTC_DT date DEFAULT NULL,
   GROUP_ID varchar(255) DEFAULT NULL,
   OBJECT_NAME  varchar(2001) DEFAULT NULL,
   OBJECT_ID  varchar(255) DEFAULT NULL,
   USER_NAME  varchar(1500) DEFAULT NULL,
   USER_ID  varchar(255) DEFAULT NULL,
   PT_EVENT_ID  varchar(255) DEFAULT NULL,
   CUSTOM_NOTES  varchar(1000) DEFAULT NULL,
   SUMMARY  varchar(4000) DEFAULT NULL
);

有人可以帮我处理 DDL 吗?

如果所有这些 ID 实际上都是 UUID,则应使用 uuid 类型定义列。

所谓的“神奇”限制 255 并没有启用某些隐藏的性能或存储优化(至少在 Postgres 中)。所以盲目地使用 varchar(255) 并没有真正的意义(当然,如果您有一个有效的业务要求 order_typeevent_type 的值可能永远不会超过 255 个字符,那么当然保持该约束。

As documented in the manual integer 数据类型也没有“长度”参数(并且它也不是 MySQL 中的值限制,所以开始时几乎没有用).

所以 DDL 应该是这样的:

CREATE TABLE event_test(
   ID              uuid PRIMARY KEY NOT NULL,
   VERSION         integer NOT NULL,
   ORDER_TYPE      varchar(255) NOT NULL,
   EVENT_TYPE      varchar(255) NOT NULL,
   CUSTOMER_ID     uuid DEFAULT NULL,
   DETAILS         text,
   OBJECT_TYPE     varchar(255) NOT NULL,
   UTC_DATE_TIME   date DEFAULT NULL,
   EVENT_TO_UTC_DT date DEFAULT NULL,
   GROUP_ID        uuid DEFAULT NULL,
   OBJECT_NAME     varchar(2001) DEFAULT NULL,
   OBJECT_ID       uuid DEFAULT NULL,
   USER_NAME       varchar(1500) DEFAULT NULL,
   USER_ID         uuid DEFAULT NULL,
   PT_EVENT_ID     uuid DEFAULT NULL,
   CUSTOM_NOTES    varchar(1000) DEFAULT NULL,
   SUMMARY         varchar(4000) DEFAULT NULL
);

要创建索引,请使用 create index:

create index on event_test (customer_id,object_type,object_id,pt_event_id);

如果“您的大部分访问”是通过 object_id 进行的,那么您需要一个作为前导列的索引:

create index on event_test (object_id);

哈希分区不会真正帮助您加快速度。


可以对table使用分区,但这几乎不是性能工具。由于 Postgres 分区实现的限制,如果您想将 id 列作为主键,您也将被迫在分区键中包含该列。但是考虑到您的声明“大多数访问是通过 object_id 进行的,分区键 (id, object_id) 根本帮不了您。