我有两个表:
table1 (about 200000 records)
number varchar(8)
table2 (about 2000000 records)
number varchar(8)
两个表中的字段“number”都有标准索引。 对于表 1 中的每条记录,表 2 中分配了大约 10 条记录。
我执行查询:
explain select table1.number from table1, table2 where table1.number = table2.number;
查询计划显示索引不会被使用,Seq Scans all over ;)
但是如果我将表 1 中的记录量减少到 ~2000 条,查询计划开始显示将使用索引。
也许有人可以告诉我为什么 postgresql 会那样做?
最佳答案
顺序扫描对于选择性非常低的查询是正常的(并且是最佳的)——也就是说,对于遍历整个表的查询。
当您从 table1 中删除大部分行时,它不再覆盖 table2 中所有可能的不同值 - 这就是开始使用索引扫描的原因。
对于初学者,我建议尝试这个查询:
select * from pg_stats where tablename in ('table1','table2');
这是 PostgreSQL 用来构建查询计划的信息。
规划器本身非常复杂 - 请查阅文档(由 Jonathan 提到)和来源 [ http://doxygen.postgresql.org/ -> src/backend/optimizer ] 如果你很好奇。
关于sql - Postgresql 8.3,不使用索引的简单查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1840159/