基于varchar字段的第一个字母的分区表

时间:2017-12-26 23:00:56

标签: database postgresql

我有一个庞大的表(超过1B记录),它具有表分区的特定要求:

(1)是否可以根据varchar字段的第一个字符对Postgres中的表进行分区?

例如:

以下3条记录:

a-blah

a-blah2b-blah将进入“A”分区,apt install PHP7.2-dev会进入“B”分区。

(2)如果使用Postgres无法实现上述目标,那么均匀分区大型增长表的好方法是什么?(没有按创建日期分区 - 因为这不是这些记录的内容有)。

1 个答案:

答案 0 :(得分:0)

您可以在var query = db.Inventario.Where(i => i.ClienteId.Equals(Global.ClienteID)) .GroupBy(i => new { Tipo = i.Tipo.TipoNombre, Zona = i.Localidad.Zona.ZonaNombre, Localidad = i.Localidad.LocalidadNombre }) .Select(i => new { Tipo = i.Key.Tipo, Zona = i.Key.Zona, Localidad = i.Key.Localidad, Estados = i.SelectMany(ei => ei.EstadoInventario).GroupBy(ei => ei.Estado.EstadoNombre) }); var data = query.ToList().Select(i => new Registro { Tipo = i.Tipo, Zona = i.Zona, Localidad = i.Localidad, Estados = i.Estodas.ToDictionary(ei => ei.Key, ei => ei.Sum(item => item.EstadoInventarioValor ? 1 : 0)) }); 子句中使用表达式,例如:

partition by

结果:

create table my_table(name text)
partition by list (left(name, 1));

create table my_table_a
partition of my_table
for values in ('a');

create table my_table_b
partition of my_table
for values in ('b');

如果分区不区分大小写,则可以使用

insert into my_table 
values
    ('abba'), ('alfa'), ('beta');

select 'a' as partition, name from my_table_a
union all
select 'b' as partition, name from my_table_b;

 partition | name 
-----------+------
 a         | abba
 a         | alfa
 b         | beta
(3 rows)

请阅读文档: