这要求:
>使用预定义数量的分区创建BRIN,等于客户机数量
>从使用WHERE BRIN分区标识符的客户端发送查询,而不是在索引列上过滤
主要目标是将单个表从Postgres加载到分布式客户端机器中,在客户机之间保持相等数量的行,或者如果行数不被机器计数分隔,则接近相等.
我可以通过维护新的列来维护新的列,使其数量等于客户端机器的数量(或者使用row_number()按顺序(按日期时间顺序)%N).这样,在时间和内存方面效率并不高,BRIN索引看起来像一个很好的功能,可以加速这种用例.
3台客户机的最小重现示例:
CREATE TABLE bigtable (datetime TIMESTAMPTZ,value TEXT); INSERT INTO bigtable VALUES ('2015-12-01 00:00:00+00'::TIMESTAMPTZ,'txt1'); INSERT INTO bigtable VALUES ('2015-12-01 05:00:00+00'::TIMESTAMPTZ,'txt2'); INSERT INTO bigtable VALUES ('2015-12-02 02:00:00+00'::TIMESTAMPTZ,'txt3'); INSERT INTO bigtable VALUES ('2015-12-02 03:00:00+00'::TIMESTAMPTZ,'txt4'); INSERT INTO bigtable VALUES ('2015-12-02 05:00:00+00'::TIMESTAMPTZ,'txt5'); INSERT INTO bigtable VALUES ('2015-12-02 16:00:00+00'::TIMESTAMPTZ,'txt6'); INSERT INTO bigtable VALUES ('2015-12-02 23:00:00+00'::TIMESTAMPTZ,'txt7');
预期产量:
>客户端1
2015-12-01 00:00:00+00,'txt1' 2015-12-01 05:00:00+00,'txt2' 2015-12-02 02:00:00+00,'txt3'
>客户端2
2015-12-02 03:00:00+00,'txt4' 2015-12-02 05:00:00+00,'txt5'
>客户端3
2015-12-02 16:00:00+00,'txt6' 2015-12-02 23:00:00+00,'txt7'
问题:
如何使用预定义数量的分区创建BRIN,并运行查询对分区标识符进行过滤,而不是对索引列进行过滤?
可以选择BRIN(或其他pg goodies)的任何其他方式可以加快从单个表并行加载多个客户端的任务?
解决方法
这听起来像您正在寻找的是使用可用于分区排除的CHECK约束进行分区. Postgresql已经支持长时间的表继承(尽管不是每个分区都在单独的机器上).使用此方法,必须为每个分区明确设置CHECK约束中涵盖的范围.这种明确指定边界的能力听起来就像您正在寻找的,只是使用不同的技术.
但是,分区排除约束码对于模数不能正常工作.代码很聪明,可以知道WHERE id = 5只需要检查CHECK(id BETWEEN 1和10)分区,因为它知道id = 5意味着id在1到10之间.更准确地说,它知道对的.
但代码从来没有写过WHERE id = 5意味着id? = 5,即使人类知道.因此,如果您在模运算符上构建分区,例如CHECK(id?= 5)而不是范围,则必须使用WHERE id = $1和id%10 = $1来填充所有查询.如果你想要利用这些限制.