database - 按字符前缀的 Postgres 分区

标签 database postgresql partitioning

美好的一天,

我想检查在列前缀上对 Postgres 表进行分区的最佳方法是什么。我有一个大表(+-300 7.5 亿行 x 10 列),我想在第 1 列的前缀上对其进行分区。 数据看起来像:

ABCDEF1xxxxxxxx
ABCDEF1xxxxxxxy
ABCDEF1xxxxxxxz
ABCDEF2xxxxxxxx
ABCDEF2xxxxxxxy
ABCDEF2xxxxxxxz
ABCDEF3xxxxxxxx
ABCDEF3xxxxxxxz
ABCDEF4xxxxxxxx
ABCDEF4xxxxxxxy

他们只会被 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);

等然后是类似逻辑的触发器:

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.*);

我担心以这种方式进行分区是否会加快查询时间?或者我是否应该考虑在 substr 上进行分区(不确定如何),或者我是否应该在该列上创建一个带有前缀和分区的新列?

如有任何建议,我们将不胜感激。

最佳答案

我知道这是一个老问题,但我添加了这个答案以防其他人需要解决方案。

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');

关于database - 按字符前缀的 Postgres 分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37689554/

相关文章:

java - 从 Oracle blob 字段中提取文件;

hibernate - 在 hibernate 中使用@NamedStoredProcedureQuery 时需要列定义列表消息

r - 将数据分成两个独立的组 s.t.最小化具有一个连续预测变量的残差平方和

postgresql - 从 Postgres 服务确定集群目录

java - 在 Hibernate Spatial 中获取 org.postgresql.geometric.PGpoint 而不是 org.postgis.PGgeometry

sql - 如何使用窗口函数枚举我的 Postgres 表中的分区组?

mysql - 表增长后优化 MySQL 操作的最佳方法

mysql - 数据库建模-mysql

php - 如何从同一列的 WordPress 自定义字段数据库中检索总和

sql-server - 使用 Windows 身份验证连接到 sql db 的 Powershell 脚本