Postgresql 8.3:限制每个查询的资源消耗


12

我正在使用PostgreSQL 8.3 + PostGIS 1.3Ubuntu 8.04 Hardy上存储地理空间数据。

buffer()在非常复杂的段上计算时,此特定版本的PostGIS存在一个错误,这会导致查询占用越来越多的内存,直到整个计算机陷入困境。

我正在寻找一种可以实现以下目的的PostgreSQL机制:

  • 限制特定查询使用的内存消耗(可能还有其他资源)。
  • 自动停止执行时间超过特定阈值的查询。

有任何想法吗?


为什么您继续使用存在会咬您的错误的版本?使用固定的版本,您的问题就消失了。
Frank Heikens 2011年

没错,但是有时候我们的代码中有错误,或者只是查询花费了太长时间。我希望他们死于日志错误消息。
亚当·马坦

Answers:


9

为了限制内存消耗,主要配置参数是work_mem。由于这是针对每个操作而不是针对每个查询,因此,如果您要花费N的内存量,则不能简单地将其设置为N,但是必须进行微调和调整才能获得所需的结果。

但是,如果服务器代码或扩展中存在错误和其他内存泄漏,这将无济于事。您可以通过控制特定于进程的资源限制来控制它ulimit。但是,如果达到极限并且内存分配失败,那么您想发生什么?它的行为可能不会太好。更好地修复这些错误或使用其他版本。

停止查询的执行时间超过阈值,请使用参数“ statement_timeout”,例如,

SET statement_timeout TO '10min';

大。正是我想要的。
亚当·马坦

2

看一下Postgres Wiki

PostgreSQL没有设施来限制特定用户,查询或数据库消耗什么资源,或相应地设置优先级,以使一个用户/查询/数据库比其他用户/资源获得更多的资源。必须使用操作系统功能来实现有限的优先级排序。

您可以调整每个用户或每个数据库的性能设置,但不能调整何时中止某些查询。


+1如何为整个群集可以使用的最大内存量设置一个最大值?
亚当·马坦
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.