PostgreSQL查询调优指南?

19

我找到许多关于调整数据库服务器的资源,但对于调整单个查询并没有很多内容。

例如,在Oracle中,我可以尝试添加提示忽略索引或使用排序合并而不是相关联的连接,但我找不到在Postgres上进行调整的很多内容,除了使用显式连接在批量加载表时进行推荐

是否存在这样的指南,以便我可以专注于调整最常用和/或性能不佳的查询,希望不会对当前表现良好的查询产生不利影响?

我甚至会很高兴找到一些相对于其他数据库执行情况的比较,以便我更好地了解要避免什么样的事情。

更新:

我应该提到,我在8i时代参加了所有Oracle DBA课程以及它们的数据建模和SQL调整课程……因此我知道“EXPLAIN”,但这更多地是告诉你查询出了什么问题,而不是如何使其更好。 (例如,当生成执行计划时,“while var = 1 or var = 2”和“while var in(1,2)”是否被认为是相同的?如果我用10个排列方式怎么办?何时使用多列索引?有什么方法可以让计划程序优化最快的启动还是最快的完成?从MySQL、Oracle或其他RDBMS移动时可能会遇到什么问题?)

我可以用几十甚至上百种方式编写任何复杂的查询,并且我希望不必通过试错来尝试它们中的每一个并找出哪一个效果最好。我已经发现“SELECT count(*)”不会使用索引,但“SELECT count(primary_key)”会……也许有一种“面向经验SQL用户的PostgreSQL”文档,可以解释要避免的查询类型以及如何最佳地重新编写它们,或者如何让计划程序更好地处理它们。

更新2:

我发现了一篇SQL实现的比较文章,其中包括了PostgreSQL、DB2、MS-SQL、MySQL、Oracle和Informix,并解释了在尝试进行某些操作时可能遇到的问题和各种情况,他的参考文献部分链接到了Oracle/SQL Server/DB2/Mckoi/MySQL数据库的等效性(其标题就是这个意思),以及维基教科书中的SQL方言参考手册,该手册涵盖了人们贡献的各种内容(包括一些DB2、SQLite、MySQL、PostgreSQL、火鸟、Vituoso、Oracle、MS-SQL、Ingres和Linter)。


虽然不是查询调优,但对于那些来自MySQL的人来说,这可能很有用:http://www.wikivs.com/wiki/MySQL_vs_PostgreSQL - Joe
对于来自Oracle的人:http://www.cs.cmu.edu/~pmerson/docs/OracleToPostgres.pdf;以及针对PostgreSQL的一般“陷阱”:http://sql-info.de/postgresql/postgres-gotchas.html - Joe
这可能对你的PostgreSQL调优有所帮助:http://tekadempiere.blogspot.ae/2014/09/tuning-postgresql-for-better-performance.html - Sajeev
@Sajeev:谢谢,但当时我更感兴趣的是调整特定的查询。对于我们这些真正深入研究Oracle的人来说,放弃提示可能非常非常困难,因为我们习惯了对引擎处理查询的方式有非常精细的控制。 - Joe
6个回答

12
关于性能不佳的查询 - 请使用 explain analyze 并阅读它。
您可以将 explain analyze 输出放在像 explain.depesz.com 这样的网站上 - 它将帮助您找到真正花费最多时间的元素。

7

有一个很好的在线工具,可以接收EXPLAIN ANALYZE的输出,并以图形化方式显示关键部分(例如错误估计、热点等)。

http://explain.depesz.com/help

顺便说一下,我认为发布的查询会变成公开的,而且“previous explains”链接已经被垃圾邮件机器人攻击了。


5

啊...我没有意识到文档中“查询规划”部分的设置(http://www.postgresql.org/docs/current/static/runtime-config-query.html)可以针对每个会话进行设置。 - Joe

5

针对您的观点,遗憾的是,在Postgres中调整查询的唯一方法就是调整其基础数据库。在Oracle中,您可以根据每个查询设置所有这些选项,并在此过程中优先选择优化器计划,但在Postgres中,您基本上要依靠优化器的决策,无论好坏。


4

PGAdmin3工具包括一个图形化解释工具,用于分解查询的处理过程。它对于显示表扫描发生的位置尤其有帮助。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接