PostgreSQL 过程语言开销(plpython/plsql/pllua...)

Rob*_*mba 15 postgresql plpgsql plpython

我试图实时任务的过程语言性能中查找有关 PostgreSQL用户定义函数的信息。

  1. 它们与内置函数相比如何?
  2. Postgres 如何调用/管理 plpython vs plpgsql vs pllua 函数(我对 Postgres 集成/上下文/数据传输方面,而不是 VM 本身感兴趣)有什么区别(在开销上)?
  3. 上下文是一个很大的开销吗?我可以将它用于实时数据映射吗(假设 1000 次查询/秒))
  4. 在 plpgsql 和其他 pg/语言中编写用户定义的函数有什么好处吗?在文档中,他们列举了优点,但我认为它们适用于所有 postgresql 过程语言。

相关发现:

Cra*_*ger 15

  1. 解释语言中的 UDF 几乎总是比用 C 或内置函数编写的 UDF 慢得多,所有其他方面都相同。

  2. 每种语言绑定都有不同的代码将 PostgreSQL 连接到该语言,优化程度不同,传递某些数据类型的方式不同,等等。因此肯定存在变化。除非您传递的数据类型在一种语言与另一种语言的处理方式上有很大不同,否则它应该不会很大,例如,一种将 ahstore作为字符串传递,另一种将其转换为 a dict

  3. 不清楚“上下文”是什么。您可以将它用于“实时数据映射”吗……嗯,这取决于该函数的作用以及它在运行的服务器上是否足够快,对于它要访问的客户端以及您的要求。一段绳子有多长?基准。

  4. PL/PgSQL 编写起来更简单,并且提供对 SQL 的更快访问。当您需要围绕大量 SQL 包装一些逻辑时,通常会更好。对于数学运算和复杂算法来说,它非常慢,因此应尽可能避免 PL/PgSQL 中的纯计算代码,以支持 C 或更快的过程语言。

用 C 重新实现 PL/PgSQL 代码时的加速可以忽略不计到超过 1000 倍。这一切都取决于代码实际在做什么。

(这种多问题不太适合 Stack Exchange,因为很难有明确的答案)


Fra*_*ens 6

上下文的开销很大吗?我可以将它用于实时数据映射(假设 1000 个查询/秒))

性能取决于硬件和功能的复杂性。我创建了一个在小型 12 核服务器和 FusionIO 卡(总成本 10000 欧元)上运行的设备,每秒可处理 20 个并发用户的约 2500 笔交易。每个事务调用 29 个存储过程来处理数据并向客户端返回一些有用的信息。有些函数只执行一个查询,其他函数则执行几个查询。总共,它每秒执行大约 200000 个 INSERT、SELECT 和 UPDATE 语句。

这都是用 PL/SQL、PL/pgSQL 和 PL/PerlU 编写的。我非常确定当(某些)函数用 C 重写时系统可以运行得更快。

在此设备中,大部分性能来自 SSD 卡。在单个旋转磁盘上,我们永远无法获得这种性能。便宜的 SSD 驱动器也会出现故障,它可以工作一个小时(因为 raid 卡的缓存),然后游戏就结束了。FusionIO 卡价格昂贵,但当您受 IO 限制时,这是一项非常好的投资。


小智 5

这很难说。这实际上取决于你在做什么。例如:如果你有大量的 SQL 语句,那么 PL/pgSQL 就很棒 - 如果你有各种分支、子字符串管理等等,它真的会变得疯狂。

你真的必须根据具体情况进行测试。