如何优化postgresql81一个拥抱查询,但不是一个复杂的?

我有一个查询在服务器上执行需要15s。 服务器是bi-xeon 5130(2GHz),内置2GB内存和160GB scsi硬盘。 数据库是Debian 4 etch上的PostgreSQL 8.1。

这个查询是由一个ERP(openerp)执行的,所以我不能改变或修改它。 我可以testing它,因为我想要的,我可以重现很长一段时间,因为我想,我把它在日志文件中,并重现案件成pgadmin。

复制/粘贴到一个txt文件,简单的查询需要存储170Kb(只是文本查询)。

在执行期间,linux(通过'top'命令行)告诉我postgres使用99-100%的CPU,但只有6%的RAM。

那么,如何提高postgres的性能来获得这个查询执行的时间。 某个地方的参数? 在Postgres? 在Linux?

查询是这样的:

SELECT id FROM sale_order_line WHERE (state IN ('confirmed', 'confirmed_wait', 'manquant')) AND (id IN (27405, 27399, 16583, 27395, XXX)) ORDER BY id DESC LIMIT 50; 

[将XXXreplace为20000的ID列表! ]

是的,这是一个怪物查询,但不是一个复杂的,其实很简单。

感谢帮助。 我search了很长时间(2周已经…)

有几个步骤可以采取:

  • 优化PostgreSQLconfiguration,以便使用正确数量的系统资源(请参阅本文为前面的雇主撰写的关于此方面全套技巧的文章);
  • 您需要优化数据库模式(特别是其中的索引),以使数据库尽可能高效地运行。 为此,请参阅前述工作中由我的一位同事撰写的关于查询调整的文章 。 它涵盖了MySQL和PostgreSQL,但只是相关的部分应该让你一路走到最终的解决scheme。