Postgres中的用户定义的联接函数?

时间:2020-02-04 16:09:13

标签: postgresql user-defined-functions

我有两个表T1和T2,它们类似于PostgreSQL数据库中较宽的表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中的问题,因为我不熟悉该系统。

为了阐明用例:我打算将数据放入外部只读文件中,例如可以通过外部表访问的CSV,我可以完全控制扫描顺序。可以将其视为一些数据存档。

Q:是否可以在PostgreSQL中编写一个用户定义的函数来处理一个游标(示例1)或两个游标(示例2)以及服务器端两次连续扫描发出的“拼接”行?

1 个答案:

答案 0 :(得分:0)

这将不起作用。 SQL语句结果的顺序是可变的,没有ORDER BY

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

  • 不能保证在表的末尾出现INSERT

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

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

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

相关问题