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

时间:2011-07-19 15:49:43

标签: sql c postgresql persistence shared-libraries

情况:

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

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

1 个答案:

答案 0 :(得分:0)

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


  

不幸的是,这种程序是程序性的; SQL就是做不到。有问题的数据是程序排序的备忘录数据,PostgreSQL不知道它的存在。

如果你可以写一个存储过程(或C函数),其采用在“备忘录数据”,并产生一个可排序字符串(或其它类型的,但字符串是最可能的),则可以在数据评估函数select-list,并按结果值进行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上的手册。