Postgresql Postgres Aurora上带索引和哈希分区的DDL

Postgresql Postgres Aurora上带索引和哈希分区的DDL,postgresql,amazon-aurora,Postgresql,Amazon Aurora,您好,我正在尝试在PostgreSQL Aurora中创建一个DDL,对象ID上有哈希分区。 我还想在CUSTOMER\u ID、OBJECT\u TYPE、OBJECT\u ID、PT\u EVENT\u ID CREATE TABLE event_test( ID varchar(255) PRIMARY KEY NOT NULL, VERSION int(11) NOT NULL, ORDER_TYPE varchar(255) NOT NULL, EVENT_TY

您好,我正在尝试在PostgreSQL Aurora中创建一个DDL,对象ID上有哈希分区。 我还想在
CUSTOMER\u ID、OBJECT\u TYPE、OBJECT\u ID、PT\u EVENT\u 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\u type
event\u type
的值可能永远不会超过255个字符,那么当然要保留该约束

integer
数据类型也没有“length”参数(在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 on event_test (customer_id,object_type,object_id,pt_event_id);
如果“大部分访问”是通过
对象id
进行的,则需要一个索引,该索引位于前导列:

create index on event_test (object_id);
散列分区并不能真正帮助您加快速度



您可以对表使用分区,但这几乎不是一个性能工具。由于Postgres分区实现的局限性,如果您想将
id
列保留为主键,您还将被迫在分区键中包含该列。但是如果您声明“大多数访问都是通过
object\u id
进行的,分区键
(id,object\u id)
对您毫无帮助。

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

所谓的“魔法”限制255无法实现某些隐藏的性能或存储优化(至少在Postgres中是这样),因此盲目使用
varchar(255)
是没有意义的(当然,如果您有一个有效的业务要求,
order\u type
event\u type
的值不能超过255个字符,那么当然要保留该约束

integer
数据类型也没有“length”参数(在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 on event_test (customer_id,object_type,object_id,pt_event_id);
如果“大部分访问”是通过
对象id
进行的,则需要一个索引,该索引位于前导列:

create index on event_test (object_id);
散列分区并不能真正帮助您加快速度



您可以对表使用分区,但这几乎不是一个性能工具。由于Postgres分区实现的局限性,如果您想将
id
列保留为主键,您还将被迫在分区键中包含该列。但是如果您声明“大多数访问都是通过
object\u id
分区键
(id,object\u id)
对您毫无帮助。

请注意
varchar(255)
决不会比
varchar(257)更有效。”
-如果您希望的话,255限制不会打开任何神奇的性能优化。这些ID号是吗?如果是,您最好将它们存储在
integer
bigint
列中。不要将所有内容都存储在
varchar(255)
和`int(11)中''对于Postgres开始无效with@a_horse_with_no_name所以ID是GUID感谢您的快速帮助,然后您应该使用
uuid
数据类型。@LaurenzAlbe我想使用哈希分区,因为我的大部分访问都是基于对象ID GUID的。我有10 TB大小的表,并且我并没有任何可以分发数据的列我需要注意的是,
varchar(255)
并没有比
varchar(257)更有效
-如果您希望的话,255限制不会打开任何神奇的性能优化。这些ID号是吗?如果是,您最好将它们存储在
integer
bigint
列中。不要将所有内容都存储在
varchar(255)
和`int(11)中''对于Postgres开始无效with@a_horse_with_no_name所以ID是GUID感谢您的快速帮助,然后您应该使用
uuid
数据类型。@LaurenzAlbe我想使用哈希分区,因为我的大部分访问都是基于对象ID GUID的。我有10 TB大小的表,并且我并没有任何可以分发数据的列ibuted@LaurenzAlbe:是的,我将其更改为与performance@a_horse_with_no_name您对性能的看法是正确的。但是我有一个10 TB的单表数据,没有任何分区。而且该限制对psotgress 12.4 Aurora无效,因此我们可以在一个非唯一且不属于主表的列上创建分区key@AtharvThakur例如我有o有使用Aurora的经验,但在“香草”Postgres中,只要将
id
定义为主键,就不能使用
partitionbyhash(object\u id)
。如果希望
分区byhash(object\u id,id),则需要将主键定义为
(object\u id,id)
-但是必须将
对象\u id
声明为
非空
,这是您当前没有的。现在还完全不清楚您正试图通过“分区”解决什么问题@一个没有名字的马,所以我们在这个大表中还面临其他一些挑战,比如如果我们从这个大表分区中删除行,那么这个表上的聚合查询也会非常慢,所以我想我可以运行长时间运行的查询分区wise@LaurenzAlbe:是的,我将其更改为与performance@a_horse_with_no_name关于性能,您是对的。但是我有一个10 TB的单表数据,没有任何分区。而且,该限制对psotgress 12.4 Aurora无效,因此我们可以在非uni的列上创建分区