PostgreSQL:指定要使用的索引

3
如果我在Postgres上有同一列上的几个索引,有什么方法可以指定在给定查询中使用哪一个?这主要是为了测试而不是生产目的。换句话说,我需要MySQL中USE INDEX甚至FORCE INDEX的替代方法。不,这不是关于强制Postgres使用索引扫描而不是普通扫描的话题,因此不是重复内容。

1
问题:为什么?答案:你不需要这样做,如果索引可用,Postgres会使用它。要让PG确定索引在您的特定查询中是否有用,需要有效的最新统计信息。 - joop
Bill:据我理解,这与强制Postgres使用索引扫描而不是普通扫描无关,这不是讨论的主题。或者我理解错了吗? - whoever
1
joop:我需要它来测试不同索引的性能,由于测试结构,使用这样的语句会更加清晰。 - whoever
1
错误。你不需要基准测试性能。你必须先验证数据模型的正确性,然后再考虑性能问题。 - joop
1
joop:这不是我在测试我的数据模型!我只需要有任何大型数据库,并测试我的索引实现版本与现有版本的区别。 - whoever
1个回答

4
很抱歉,Postgres中没有这样的东西:
参见http://wiki.postgresql.org/wiki/OptimizerHintsDiscussion 引用: 多年来,许多人请求PostgreSQL项目实现“优化器提示”或“查询提示”,就像Oracle和MySQL等其他RDBMS中实现的那样。 社区的官方立场是: 我们不感兴趣以其他数据库通常实现的确切方式实现提示。 基于“因为他们拥有它们”的提议将不受欢迎。 如果您有一个避免了其他提示系统存在的问题的想法,那可能会导致有价值的讨论。
维基列出了一些提示的替代方案here,但是这些建议都不是您要寻找的等效物。

然而,根据from_collapse_limitjoin_collapse_limit的值(您可以在运行时设置/重置它们),您可能能够强制执行如14.3. Controlling the Planner with Explicit JOIN Clauses所述的连接顺序。这可能会间接影响使用的索引,但是再次强调,没有显式选择索引。


谢谢你的回答,Postgres提供了其他数据库不具备的大量功能。但我今天遇到的一个问题是,尽管我已经尽力了,它仍然选择了错误的索引来处理。 - Kevin Parker
尝试一下这里描述的内容:https://www.postgresql.org/docs/12/indexes-examine.html,你可能会真正能够通过设置以下选项之一来强制计划类型:https://www.postgresql.org/docs/12/runtime-config-query.html。还要查看链接的重复问题中的其他答案。很可能你的索引、统计信息或查询存在问题,强制计划可能不会达到你想要的效果。同时检查索引是否包含所有必要的列,如果有,优化器应该会使用它们。 - jmiserez

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