PostgreSQL 查询调优指南?
Posted
技术标签:
【中文标题】PostgreSQL 查询调优指南?【英文标题】:Guides for PostgreSQL query tuning? 【发布时间】:2010-12-05 04:21:21 【问题描述】:我找到了很多关于调整数据库服务器的资源,但我没有找到很多关于调整单个查询的资源。
例如,在 Oracle 中,我可能会尝试添加提示以忽略索引或使用排序合并与相关连接,但除了 using explicit joins 和 bulk loading tables 时的建议之外,我找不到太多关于调整 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)' 会......也许是一个'PostgreSQL for有经验的 SQL 用户'的文档,解释了各种查询避免,以及如何最好地重写它们,或者如何让规划者更好地处理它们。
更新 2:
我找到了一个Comparison of different SQL Implementations,它涵盖了 PostgreSQL、DB2、MS-SQL、mySQL、Oracle 和 Informix,并解释了您可能尝试做的事情是否、如何以及遇到的问题,他的参考部分链接到 Oracle / SQL Server / DB2 / Mckoi /MySQL Database Equivalents (这就是它的标题所暗示的)和***SQL Dialects Reference,它涵盖了人们所做的任何贡献(包括一些 DB2、SQLite、mySQL、PostgreSQL、Firebird、Vituoso、Oracle、MS-SQL、Ingres 和 Linter)。
【问题讨论】:
不完全是查询调优,但对于那些来自 mysql 的人来说,这可能很有用:wikivs.com/wiki/MySQL_vs_PostgreSQL 对于来自 Oracle 的人:cs.cmu.edu/~pmerson/docs/OracleToPostgres.pdf;一般来说,postgres 的“陷阱”:sql-info.de/postgresql/postgres-gotchas.html 这可能对你 postgres 调整有用:tekadempiere.blogspot.ae/2014/09/… @Sajeev :谢谢,但当时我对调整特定查询更感兴趣。对于我们这些真正接触过 Oracle 的人来说,放弃提示可能非常非常困难,因为我们习惯于能够非常精细地控制引擎如何处理查询。 【参考方案1】:http://www.postgresql.org/docs/current/static/indexes-examine.html
你可以给出提示:SET enable_indexscan TO false;
会让 PostgreSQL 尽量不使用索引
【讨论】:
啊...我没有意识到文档的“查询计划”部分中的设置 (postgresql.org/docs/current/static/runtime-config-query.html) 可以在每个会话中设置。【参考方案2】:我见过的最好的在这里:http://wiki.postgresql.org/wiki/Using_EXPLAIN,但那里最新的 PDF 是 2008 年的,所以可能有更新的东西。我很想听听其他用户的回答。
另外,contrib 包中正在酝酿一些东西:http://www.sai.msu.su/~megera/wiki/plantuner
【讨论】:
【参考方案3】:PGAdmin3 工具包括一个图形解释工具,用于分解查询的处理方式。它还特别有助于显示发生表扫描的位置。
【讨论】:
【参考方案4】:为了解决您的问题,不幸的是,在 Postgres 中调整查询的唯一方法就是调整其底层的数据库。在 oracle 中,您可以逐个查询设置所有这些选项,在此过程中胜过优化器计划,但在 Postgres 中,无论好坏,您几乎都受制于优化器。
【讨论】:
【参考方案5】:至于表现不佳的查询 - 请解释分析并阅读它。
您可以将解释分析输出放在explain.depesz.com 之类的网站上 - 它会帮助您找到真正花费最多时间的元素。
【讨论】:
【参考方案6】:有一个不错的在线工具可以输出EXPLAIN ANALYZE
,并以图形方式显示关键部分(例如错误估计、热点等)
http://explain.depesz.com/help
顺便说一句,我认为发布的查询会公开,并且“以前的解释”链接已被垃圾邮件机器人点击。
【讨论】:
以上是关于PostgreSQL 查询调优指南?的主要内容,如果未能解决你的问题,请参考以下文章