虽然 PostgreSQL 中的索引不需要维护或调优,但检查实际查询工作负载使用了哪些索引仍然很重要。检查单个查询的索引使用情况可以使用 EXPLAIN 命令;其在此用途中的应用在 第 14.1 节 中进行了说明。也可以收集关于运行服务器中索引使用情况的整体统计信息,如 第 27.2 节 所述。
很难制定一个通用过程来确定要创建哪些索引。在前面的章节中的例子中已经展示了一些典型的案例。通常需要大量的实验。本节的其余部分给出了一些建议。
始终首先运行 ANALYZE。此命令收集关于表中值的分布的统计信息。此信息是估算查询返回的行数所必需的,规划器需要此信息来为每个可能的查询计划分配合理的成本。在没有任何实际统计信息的情况下,会假设一些默认值,这些默认值几乎肯定是不准确的。因此,在没有运行 ANALYZE
的情况下检查应用程序的索引使用情况是徒劳的。有关更多信息,请参阅 第 24.1.3 节 和 第 24.1.6 节。
使用真实数据进行实验。使用测试数据来设置索引会告诉您测试数据需要哪些索引,但仅此而已。
使用非常小的测试数据集尤其致命。虽然从 100000 行中选择 1000 行可能适合使用索引,但从 100 行中选择 1 行几乎不适合,因为这 100 行可能适合放在一个磁盘页中,并且没有哪种计划可以胜过顺序提取 1 个磁盘页。
在制作测试数据时也要小心,这在应用程序尚未投入生产时通常是不可避免的。非常相似、完全随机或按排序顺序插入的值会使统计信息偏离真实数据可能具有的分布。
当不使用索引时,强制使用索引进行测试可能会很有用。有一些运行时参数可以关闭各种计划类型(请参阅 第 19.7.1 节)。例如,关闭顺序扫描 (enable_seqscan
) 和嵌套循环连接 (enable_nestloop
),它们是最基本的计划,将强制系统使用不同的计划。如果系统仍然选择顺序扫描或嵌套循环连接,则可能存在不使用索引的更根本的原因;例如,查询条件与索引不匹配。(前几节解释了哪种查询可以使用哪种索引。)
如果强制使用索引确实使用了索引,则有两种可能性:要么系统是正确的,并且使用索引确实不合适,要么查询计划的成本估算没有反映现实。因此,您应该定时测试使用和不使用索引的查询。EXPLAIN ANALYZE
命令在此处非常有用。
如果事实证明成本估算错误,则同样有两种可能性。总成本是根据每个计划节点的每行成本乘以计划节点的选择性估算计算得出的。可以通运行时参数调整为计划节点估算的成本(在第 19.7.2 节中描述)。不准确的选择性估算归因于统计信息不足。可以通过调整统计信息收集参数来改进这种情况(请参阅 ALTER TABLE)。
如果您无法成功调整成本以使其更合适,则可能必须诉诸于显式强制使用索引。您可能还想联系 PostgreSQL 开发人员来检查问题。
如果您在文档中发现任何不正确的内容,或者与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。