我有一个查询需要 40 秒来执行超过 80 毫秒,如果 postgres 在哪里过滤掉主键而不是进行顺序扫描,它应该这样做。我必须通过设置上面的标志来强制 postgres 过滤掉索引。
必须将其粘贴到 UDF 中对我来说似乎是一个 hack,我的意思是在 IMO 中,查询计划器在索引过滤器上选择 seq 扫描是不合理的。我的大部分 SQL 经验都来自于 SQL Server,而且我还没有经历过这种基本优化的错误规划。
编辑: 对任何感兴趣的人来说,9.2 的查询执行时间从 80 毫秒下降到 27 毫秒,holly molley。
enable_seqscan=true 并没有按照您的想法行事。它只允许计划者选择那个。它不强迫它。
请注意,它通常应该是打开的。PostgreSQL 中的顺序扫描比 MySQL 中的顺序扫描成本低得多,因为它们按物理顺序扫描。很多时候它们是更便宜的计划。
不要全局设置它,这会导致糟糕的查询计划。但是有一些合理的用例
enable_seqscan=False
。我在这里引用手册:因此,如果由于某种原因,规划器一直选择顺序扫描,而另一种扫描类型会更快,这可能是您的丑陋修复 -仅适用于此查询。如果没有其他路由可用,Postgres 仍将使用顺序扫描。
当然,在大多数情况下,您只是在掩盖潜在的问题——计划者从一开始就不应该那么错。您可能想开始挖掘设置中的错误。
autovacuum
开启(默认),那么是否ANALYZE
会自动针对您的表格运行?试试手册甚至:
首先。然后阅读有关Planner Cost Constants
random_page_cost
的章节并在此处或 SO 上搜索关键字......您的设置可能有很大偏差。打包的默认值对于更大的数据库几乎没有任何好处。