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


12

我正在尝试以过程语言性能来查找有关PostgreSQL 用户定义函数的信息,以执行实时任务。

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

相关发现:

Answers:


13
  1. 在其他所有条件相同的情况下,解释语言的UDF总是比用C或内置函数编写的UDF慢。

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

  3. 不清楚什么是“上下文”。您能否将其用于“实时数据映射” ...取决于功能的作用以及在运行的服务器上,针对要使用的客户端以及您的要求的速度是否足够快。一段绳子有多长?基准测试。

  4. PL / PgSQL易于编写,并提供对SQL的更快访问。通常,当您需要围绕大量SQL封装一些逻辑时,通常会更好。对于数学运算和复杂算法而言,这非常慢,因此应尽可能避免使用PL / PgSQL中的纯计算代码,而应使用C或更快的过程语言。

在C中重新实现PL / PgSQL代码时,加速的范围从疏忽到超过1000倍不等。这完全取决于代码的实际作用。

(这种多问题不适用于Stack Exchange,因为很难获得明确的答案)


在上下文中,我的意思是所有需要来回传输到程序环境的数据
Robert Zaremba 2014年

4

这很难说。这真的取决于您在做什么。例如:PL / pgSQL如果其中包含大型SQL语句,那就太好了-如果您具有各种分支,子字符串管理以及所有这些功能,它的确会发疯。

您确实需要逐案进行测试。


4

上下文是否有很大的开销?我可以使用它进行实时数据映射吗(假设每秒1000个查询)

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

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

在此设备中,大多数性能来自SSD卡。在单个旋转磁盘上,我们将永远无法获得这种性能。廉价的SSD驱动器也会发生故障,它会工作一个小时(由于RAID卡的缓存),然后游戏就结束了。FusionIO卡价格昂贵,但在受IO约束时,这是一笔非常好的投资。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.