sql – 直接按块范围索引(BRIN)标识符查询Postgres表
我有N台客户机.我想加载每个具有不同分区的BRIN索引的机器.
这要求: >使用预定义数量的分区创建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索引范围覆盖整个(本地)表,那么它永远不会非常有用.这听起来像您正在寻找的是使用可用于分区排除的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来填充所有查询.如果你想要利用这些限制. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |