如何在postgresql中的分区表上使用索引8.3.7

如何在postgresql中的分区表上使用索引8.3.7

问题描述:

我遇到这样的情况,即运行按分区表中的索引列进行筛选的查询执行全表扫描。如何在postgresql中的分区表上使用索引8.3.7

显然,这是postgresql中的一个已知问题,详细解释如下:here

除了在每个分区上执行查询,然后在所有结果上执行UNION之外,有没有更优雅的解决方法?

+0

请在此处查询Postgres性能邮件列表http://archives.postgresql.org/pgsql-performance/。 – 2009-06-17 15:21:14

索引工作得很好,只扫描PostgreSQL中的相关分区。但是,你必须正确设置好一切为它工作,而且很容易错过的东西记录的长列表中的一步http://www.postgresql.org/docs/current/static/ddl-partitioning.html

实现的主要问题是,为了避免顺序扫描,你必须向PostgreSQL提供足够的信息,以便可以证明某些分区无法获得您要查找的数据;那么它们被跳过作为查询结果的潜在来源。您链接的文章指出这是seq扫描问题的解决方案:“如果您将范围约束添加到每个分区的日期字段,则可以将该查询优化为一个循环,您可以先查询”最新“分区并进行工作直到找到一个高于所有剩余分区范围的单个值。“ - 但没有显示您在更改后看到的改进计划。

你可能已经取得了一些常见的错误:

在postgresql.conf文件-The constraint_exclusion参数默认是关闭的。有了这个默认值,你不会得到你所期望的。

- 未使用CHECK创建不重叠的分区,这使得计划者无法知道每个分区内部的内容。有可能错过这一步,但仍然可以正确地将数据放入正确的分区,规划人员不会知道这一点。

- 未在每个分区上放置索引,只在主表上创建一个索引。这将使您在相关​​分区上进行顺序扫描,因此不会像上述那样糟糕,但也不是很好。

在即将发布的PostgreSQL发行版中有一些工作可以让这一切变得更容易(在8.4中设置constraint_partition是相当自动的,某些分区设置自动化正在工作)。现在,如果您仔细按照说明进行操作并避免所有这些问题,那么它应该可以工作。