11.12. 检查索引用法

尽管 PostgreSQL 中的索引不需要维护或调整,但检查实际查询工作负载实际使用了哪些索引仍然很重要。使用EXPLAIN命令可以检查单个查询的索引使用情况;其在Section 14.1中说明了此应用。如Section 28.2中所述,还可以收集有关正在运行的服务器中索引使用情况的总体统计信息。

很难制定确定要创建哪些索引的通用过程。前面各节的示例中显示了许多典型情况。通常需要进行大量实验。本节的其余部分为此提供了一些提示:

  • 一律先执行ANALYZE。此命令收集有关表中值分布的统计信息。需要此信息来估计查询返回的行数,计划人员需要使用此信息才能为每个可能的查询计划分配实际成本。在没有任何实际统计信息的情况下,将假定一些默认值,这些默认值几乎可以肯定是不准确的。因此,在没有运行ANALYZE的情况下检查应用程序的索引使用情况是一个失败的原因。有关更多信息,请参见Section 24.1.3Section 24.1.6

  • 使用真实数据进行实验。使用测试数据设置索引将告诉您测试数据需要哪些索引,仅此而已。

使用非常小的测试数据集尤其致命。虽然从 100000 行中选择 1000 行可能是索引的候选对象,但在 100 行中选择 1 行几乎是不可能的,因为 100 行可能适合单个磁盘页面,并且没有计划可以胜任 Sequences 读取 1 个磁盘页面的计划。 。

编写测试数据时也要小心,这在应用程序尚未投入生产时通常是不可避免的。非常相似,完全随机或按排序 Sequences 插入的值会使统计信息偏离真实数据的分布。

  • 如果不使用索引,则对强制使用索引很有用。有一些运行时参数可以关闭各种计划类型(请参阅Section 19.7.1)。例如,关闭最基本的计划即 Sequences 扫描(enable_seqscan)和嵌套循环联接(enable_nestloop)将迫使系统使用其他计划。如果系统仍然选择 Sequences 扫描或嵌套循环联接,则可能存在更根本的原因,即不使用索引。例如,查询条件与索引不匹配。 (前面几节已经说明了哪种查询可以使用哪种索引.)

  • 如果强制使用索引确实使用了索引,则有两种可能性:系统是否正确,使用索引确实不合适,或者查询计划的成本估算未反映现实。因此,您应该对有索引和无索引的查询进行计时。 EXPLAIN ANALYZE命令在这里很有用。

  • 如果事实证明成本估算是错误的,则有两种可能性。总成本是根据每个计划节点的每行成本乘以计划节点的选择性估算得出的。可以通过运行时参数(在Section 19.7.2中描述)来调整计划节点的估计成本。选择性估计不准确是由于统计数据不足。通过调整统计信息收集参数(请参阅ALTER TABLE)可以改善此问题。

如果您没有成功调整成本以使其更合适,那么您可能必须诉诸于强制强制使用索引。您可能还需要与 PostgreSQL 开发人员联系以研究该问题。