Postgres函数用户定义的联接?

问题描述 投票:2回答:1

我有两个表T1和T2,它们类似于Postgres数据库中较宽的表T的垂直分区。

我想通过在每个表上使用表扫描操作来廉价地连接这些分区,类似于类似于MERGE-JOIN的操作,该操作将行对成对地组合到新行。我的方法将假设表可以按其扫描顺序进行合并联接,而无需对任何联接谓词进行排序或检查。主要目标是避免使用某些行标识符来进行显式联接,该行标识符也需要复制到所有分区中,这似乎是PG中垂直分区的常见模式。

表T1和T2没有索引,并且严格是只读的。因此,优化器将找不到其他方法以不同的顺序访问它们。禁用并行查询,以避免并行扫描操作。

Q1)在采取了这些预防措施的情况下,PG中是否有任何保证始终以插入顺序返回行,例如抽真空后?

Q2)是否可以编写实现类似于MERGE-JOIN的操作的UDF,即类似于以下内容的东西:

SELECT T1.*, func('T2') FROM T1;

SELECT * FROM func('T1', 'T2');

似乎可以归结为编写用户定义的PG联接运算符。

更多的想法:我的理解是PL / pgSQL函数将结果存储在RETURN NEXT和RETURN QUERY中,如果T有很多行,这可能会很昂贵。不知道游标是否有类似的开销。因此,我真的不知道从哪里开始寻找。

postgresql user-defined-functions
1个回答
0
投票

这不起作用。 SQL语句结果的顺序是不带ORDER BY的变量:

  • 每个UPDATE都会更改表行的物理位置。

  • 无法保证在表的末尾出现INSERT

  • 即使没有更改,顺序扫描也不会总是从头开始。

唯一可以使它起作用的方法是,如果您以正确的顺序将数据填充到空表中,再也不要修改表并将synchronous_seqscan设置为off,但是我想那不是您想要的。想做。

我认为您的想法是过早的优化,您应该创建一个外键并按照Codd的要求加入。另外,如果您的主要问题是列太多,则可以将不太重要的属性集中到jsonb列中,如果PostgreSQL太大,PostgreSQL可以将其存储在TOAST表中。

© www.soinside.com 2019 - 2024. All rights reserved.