首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在postgresql 8.3.7中对分区表使用索引

如何在postgresql 8.3.7中对分区表使用索引
EN

Stack Overflow用户
提问于 2009-06-17 14:48:26
回答 1查看 10.1K关注 0票数 5

我遇到过这样的情况:运行一个按分区表中的索引列过滤的查询时,会执行全表扫描。

显然,这是postgresql中的一个已知问题,here对此进行了详细的解释。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-21 16:28:28

只扫描PostgreSQL中的相关分区,索引就能正常工作。但是,您必须正确地设置所有内容才能使其正常工作,并且很容易遗漏http://www.postgresql.org/docs/current/static/ddl-partitioning.html中记录的一长串内容中的一个步骤

要认识到的主要事情是,为了避免顺序扫描,您必须向PostgreSQL提供足够的信息,以便它能够证明某些分区不能包含您正在寻找的数据;然后,将它们作为查询结果的潜在来源跳过。您链接的文章指出了这一点,并将其作为seq扫描问题的解决方案:“如果您向每个分区的日期字段添加范围约束,则可以将此查询优化为一个循环,在此循环中,您首先查询”最新“分区,然后向后工作,直到找到一个高于所有其余分区的范围的值。”--但没有显示在该更改之后您将看到的改进计划。

你可能会犯一些常见的错误:

默认情况下,postgresql.conf文件中的-The constraint_exclusion参数处于禁用状态。使用该默认设置,您将不会得到您期望的结果。

-没有使用CHECK创建不重叠的分区,这会让规划人员不知道每个分区里面有什么。可能会错过这一步,但仍然可以将数据正确地放到正确的分区中,规划者只是不会知道这一点。

-Did没有在每个分区上建立索引,只是在主表上创建了一个索引。这将使您只在相关分区上进行顺序扫描,因此不像上面的那样糟糕,但也不是很好。

在即将到来的PostgreSQL版本中,有一些工作可以让这一切变得更容易(在8.4中,设置constraint_partition是相当自动的,并且正在进行某种类型的分区设置自动化)。现在,如果您仔细遵循说明,并避免所有这些问题,它应该可以工作。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1007523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档