我有 N 台客户机。我想将每台机器加载不同的BRIN索引分区。
这需要以下操作:
- 创建具有预定义分区数量(等于客户机数量)的BRIN索引
- 从客户端发送查询,使用BRIN分区标识符而不是对索引列进行过滤的WHERE
主要目标是在将单个表从Postgres加载到分布式客户端机器时提高性能,保持客户端之间的行数相等或接近相等(如果行数不能被机器数量整除)。
我目前可以通过维护新的列来实现它,该列将我的表划分为等于客户机数量的桶的数量(或在运行时使用 row_number() over (order by datetime) % 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好处)加速从单个表中并行加载多个客户端的任务?
row_number() over (order by datetime) % N
会将每个第N
行放入一个桶中(与您的示例中的前N
行、第二行等不同)。例如,第一组将是 1、4、7 而不是 1、2、3。 - FuzzyTreerow_number() over ()
是一个较差的解决方法,如果足够暴露BRIN,则可以提供更好的解决方案。 - jangorecki