Qui*_*ype 5 database postgresql partitioning
再会,
我想检查一下按列前缀对 Postgres 表进行分区的最佳方法是什么。我有一个大表(+- 300 750 百万行 x 10 列),我想在第 1 列的前缀上对其进行分区。数据如下所示:
ABCDEF1xxxxxxxx
ABCDEF1xxxxxxxy
ABCDEF1xxxxxxxz
ABCDEF2xxxxxxxx
ABCDEF2xxxxxxxy
ABCDEF2xxxxxxxz
ABCDEF3xxxxxxxx
ABCDEF3xxxxxxxz
ABCDEF4xxxxxxxx
ABCDEF4xxxxxxxy
Run Code Online (Sandbox Code Playgroud)
他们的意愿只有 10 个分区,即 ABCDEF0...->ABCDEF9...
我目前所做的是制作如下表格:
CREATE TABLE public.mydata_ABCDEF1 (
CHECK ( col1 like 'ABCDEF1%' )
) INHERITS (public.mydata);
CREATE TABLE public.mydata_ABCDEF2 (
CHECK ( col1 like 'ABCDEF2%' )
) INHERITS (public.mydata);
Run Code Online (Sandbox Code Playgroud)
等等,然后触发类似的逻辑:
IF ( NEW.col1 like 'ABCDEF1%' ) THEN
INSERT INTO public.mydata_ABCDEF1 VALUES (NEW.*);
ELSIF ( NEW.imsi like 'ABCDEF2%' ) THEN
INSERT INTO public.simdata_ABCDEF2 VALUES (NEW.*);
Run Code Online (Sandbox Code Playgroud)
我担心以这种方式分区是否会加快查询时间?或者我是否应该考虑对 substr 进行分区(不知道如何),或者我是否应该在该列上创建一个带有前缀和分区的新列?
任何建议表示赞赏。
小智 6
我知道这是一个老问题,但我添加这个答案以防其他人需要解决方案。
Postgres 10 允许范围分区https://www.postgresql.org/docs/10/static/ddl-partitioning.html。
虽然文档中的示例使用日期范围,但您也可以使用字符串范围,因为 Postgres(大部分)使用 ASCII 排序。下面的代码创建一个父表,然后创建两个子表,根据您的具体代码,它们应该根据提供的前缀自动对任何字母数字进行分类。这些范围必须不重叠,这就是为什么我无法创建从 ABCDEF1 到 ABCDEF2 的范围。
CREATE TABLE mydata (...) PARTITION BY RANGE (col1);
CREATE TABLE mydata_abcdef1 PARTITION OF mydata
FOR VALUES FROM ('ACBCDEF1') to ('ABCDEF1z');
CREATE TABLE mydata_abcdef1 PARTITION OF mydata
FOR VALUES FROM ('ACBCDEF2') to ('ABCDEF2z');
Run Code Online (Sandbox Code Playgroud)
当每个分区表都对其索引进行适当分区时,它将显着加快查询速度,例如:
CREATE INDEX ON public.mydata_ABCDEF1 (...) WHERE col1 like 'ABCDEF1%';
Run Code Online (Sandbox Code Playgroud)