内容提要
本文讨论了如何通过调整PostgreSQL的查询规划器来强制使用索引。通常情况下,PostgreSQL会选择顺序扫描而非索引扫描,尽管索引扫描可能更优。可以通过将`enable_seqscan`设置为off来强制使用索引,或者通过增加数据量使索引扫描的成本低于顺序扫描,从而促使查询规划器选择索引扫描。
延伸解读
理解成本估算与执行计划选择
PostgreSQL 的查询规划器基于成本估算选择执行计划,成本是预估的,与执行时间不成正比。成本受多种因素影响,如预测返回的行数。因此,即使索引可用,规划器也可能因估算顺序扫描成本更低而选择顺序扫描。这解释了为何创建索引后,查询仍可能使用顺序扫描。
强制使用索引的两种方法
文章介绍了两种强制使用索引的方法:一是通过 SET SESSION enable_seqscan = off 临时禁用顺序扫描,促使规划器选择索引扫描;二是增加数据量,使顺序扫描成本超过索引扫描,从而自然选择索引扫描。前者是人为干预,后者更自然,但都需要索引适用于查询。
enable_seqscan 选项的注意事项
enable_seqscan 设置为 off 并不能完全禁止顺序扫描,如果顺序扫描是唯一可能,规划器仍会使用。该选项只是鼓励规划器避免顺序扫描。此外,该设置仅影响当前会话,需谨慎使用,因为它可能强制规划器选择非最优计划。
数据量对索引选择的影响
随着数据量增加,顺序扫描的成本增长快于索引扫描。当数据量达到一定阈值,顺序扫描成本将高于索引扫描,规划器便会选择索引扫描。文章示例中,插入 10000 行后,即使 enable_seqscan 为默认值,查询也使用了索引扫描。
Q&A
如何强制PostgreSQL使用索引而不是顺序扫描?
可以通过将`enable_seqscan`设置为off来强制PostgreSQL使用索引。
PostgreSQL选择顺序扫描的原因是什么?
PostgreSQL选择顺序扫描是因为它评估后认为顺序扫描的成本低于索引扫描的成本。
增加数据量如何影响PostgreSQL的查询规划?
增加数据量可以促使查询规划器选择索引扫描,因为顺序扫描的成本会随着数据量增加而增加。
如何查看PostgreSQL的查询计划?
可以使用`EXPLAIN`语句来查看PostgreSQL的查询计划。
在什么情况下PostgreSQL会选择索引扫描?
当索引扫描的成本低于顺序扫描的成本时,PostgreSQL会选择索引扫描。
如何恢复PostgreSQL的默认查询规划行为?
可以通过将`enable_seqscan`设置为DEFAULT来恢复PostgreSQL的默认查询规划行为。