gpt4 book ai didi

sql - 使用持久数据的 C 扩展的 PostgreSQL 查询隔离

转载 作者:太空宇宙 更新时间:2023-11-04 04:56:35 25 4
gpt4 key购买 nike

情况:

  • 我需要对查询结果集进行程序化排序。
  • 数据集大小/访问频率不允许这种排序发生在应用程序内存中。
  • 我想要一个用 C 编写的共享库作为查询中的 ORDER BY 参数。它应该接受正在排序的行中的一些字段并分配一个分数,结果取决于已经阅读的内容。

那么:如何处理 PostgreSQL 共享库中的堆数据,这些堆数据应该在查询中保留,而不是在它们之间保留?

最佳答案

DBMS 将确定 ORDER BY 子句是将数据保存在内存中还是溢出到磁盘。您不太可能通过在查询的 ORDER BY 子句中调用的存储过程来更改它。我也完全不清楚您的假设程序是否会尝试将数据保存在内存中或将其溢出到磁盘。您应该让 DBMS 进行排序;它的种类通常都经过了很好的调整。您只需要确保它(DBMS)可以进行您需要的比较。


Unfortunately the sort is procedural; SQL just can't do it. The data in question is memo data for the procedural sort and PostgreSQL has no knowledge of its existence.

如果您可以编写一个存储过程(或 C 函数)来接收“备忘录数据”并生成可排序的字符串(或其他类型,但字符串是最合理的),那么您可以对数据计算函数选择列表,并让 SQL 按结果值排序。该过程必须一次仅基于一行来确定字符串的稳定值。

SELECT t.id, t.memo_data, magic_function(t.memo_data) AS sortable
FROM SomeTable AS T
ORDER BY sortable;

您可能必须在 ORDER BY 子句中指定函数,或者退回到“顺序位置”排序 (ORDER BY 3)。您编写 SQL 识别为 magic_function() 的 C 代码。

请注意,此函数只能对单个值进行操作(或者,更准确地说,一次从单行数据传递给它的参数)。让它依赖于任何其他行通常是不可行的。它必须是一个不变的函数——给定相同的输入,它必须总是产生相同的输出。如果不这样做,您将获得准随机结果。

您可能需要查找“内存持续时间”。可以想象,您可能能够分配函数可以使用的具有“语句持续时间”的内存,但是您随后需要考虑如何初始化和释放它。您可能需要查看 Memory Management 上的手册.

关于sql - 使用持久数据的 C 扩展的 PostgreSQL 查询隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6750110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com