Postgresql Postgres Aurora上带索引和哈希分区的DDL
您好,我正在尝试在PostgreSQL Aurora中创建一个DDL,对象ID上有哈希分区。 我还想在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
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的列上创建分区