gpt4 book ai didi

java - 用Java通过索引结构、数据类型、检索类型等扩展PostgreSQL?

转载 作者:搜寻专家 更新时间:2023-11-01 02:28:51 24 4
gpt4 key购买 nike

我了解到 PostgreSQL 是用 C 编写的。我想通过以下方式扩展它

  • 定制的索引结构
  • 定制的最近邻检索(具有各种距离函数)
  • 自定义数据类型

到目前为止,我害怕使用 PostgreSQL,因为它是用 C 编写的。但是,我在 PostgreSQL 关于页面 ( http://www.postgresql.org/about/) 上看到它们支持“库接口(interface)”,例如对于Java。因此,我可以使用 Java 来实现(至少)最近邻检索和自定义数据类型(我猜不是索引结构,因为它非常低级)?

最佳答案

这里的答案是“这很复杂”。实际上,您可以使用过程语言(包括 pl/java)走得更远,但您永远无法获得使用 C 所能获得的灵 active 。根本缺少的是能够在 PL/Java 中提供适当的索引支持,因为一个无法创建新的基元。更多信息,您可能需要查看 my blog尽管大多数示例都在 pl/pgsql 中。

类型

现在您实际上可以使用 PL/Java(或 PL/Perl,或 PL/Python,或任何您喜欢的语言)走得更远,但有些事情将遥不可及。这也是对数据库中过程语言可以做什么和不可以做什么的高度概述。

有两种有效的方法可以处理过程语言中的类型。您可以使用域(基元的子类型),也可以使用复杂类型(具有属性的对象,每个属性都是另一种类型,可以是基元、域或复杂类型本身)。一般来说,在索引复杂类型本身方面你不能做太多事情,但你可以索引它们的成员。另一件不安全的事情是输出格式化,但您可以提供其他功能来替换它。

例如,假设我们想要一个类型来存储 PNG 文件并针对数据库中的某些属性处理它们。我们可以通过以下方式做到这一点:

CREATE DOMAIN png_image as bytea check value like [magic number goes here];

然后我们可以创建一堆存储过程来以各种方式处理 png。例如,我们可能会在函数 is_sunset 中寻找顶部附近的橙色。我们也许可以做类似的事情:

SELECT name FROM landmark l
JOIN landmark s ON (s.name = 'San Diego City hall'
and ST_DISTANCE(l.coords, s.coords) < '20')
WHERE is_sunset(photo)
ORDER BY name;

没有理由不能用 Java、Perl 或任何您喜欢的语言来处理 is_sunset。由于 is_sunset 返回 boolean 值,我们甚至可以:

CREATE INDEX l_name_sunset_idx ON landmark (name) where is_sunset(photo);

这将允许我们缓存日落照片名称的索引,从而加快查询速度。

在 Java 中不能做的是创建新的基本类型。请记住,索引支持之类的东西处于原始级别,因此您不能创建支持 GiST 索引的新 ip 地址类型(您不需要这样做,因为 ip4r 可用)。

因此,在您可以重复使用和使用已经存在的原语的范围内,您可以使用 Java 或任何您喜欢的语言进行开发。您实际上只受可用原语的限制,而且有足够多的人用 C 语言编写了新的原语,您可能根本不需要接触这些。

索引

索引代码和基元一样几乎都是 C 语言。您不能在过程语言中自定义索​​引行为。您可以做的是使用其他开发人员的原语等等。这是您最有可能不得不降到 C 的区域。

(更新:正如我所想,使用 CREATE OPERATOR CLASS 可以 Hook 现有索引类型以添加​​对基于其他 PL 函数的各种索引的支持CREATE OPERATOR 命令。不过我没有这样做的经验。)

性能

请记住,PL/Java 意味着您在每个后端进程中运行一个 JVM。在许多情况下,如果你能在 pl/pgsql 中做你想做的事,你将获得更好的性能。当然,其他语言也是如此,因为您需要在后端过程中使用解释器或其他环境。

关于java - 用Java通过索引结构、数据类型、检索类型等扩展PostgreSQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14564674/

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