sql – 直接按块范围索引(BRIN)标识符查询Postgres表

前端之家收集整理的这篇文章主要介绍了sql – 直接按块范围索引(BRIN)标识符查询Postgres表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有N台客户机.我想加载每个具有不同分区的BRIN索引的机器.

这要求:

>使用预定义数量的分区创建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)的任何其他方式可以加快从单个表并行加载多个客户端的任务?

解决方法

这听起来像是要在许多机器上分割表,并且每个本地表(全局表的一个分片)具有一个具有一个桶的BRIN索引.但这没有任何意义.如果单个BRIN索引范围覆盖整个(本地)表,那么它永远不会非常有用.

这听起来像您正在寻找的是使用可用于分区排除的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来填充所有查询.如果你想要利用这些限制.

猜你在找的MsSQL相关文章