sql - Postgresql 8.3,不使用索引的简单查询

标签 sql postgresql

我有两个表:

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/

相关文章:

postgresql - 将 Google Compute Engine 连接到 Cloud SQL

php - 使用 mysql_fetch_array 将记录彼此相邻地放入列中?

mysql - 如何使用同一列中的数据创建 SQL View 作为单独的行?

postgresql - jOOQ 的 fetchLazy() 真的很懒吗?

sql - 分组依据并添加列

database - 在卖家有很多产品和产品有很多卖家的 Postgresql 数据库中,价格应该存储在哪里?

ruby-on-rails - Rails ActiveRecord 字符串字段编码与 Ruby 字符串编码

sql - 连接两个以上的表而不重复值

mysql - 如何使用连接表并通过选择查询进行计数

sql - ORA-01446 - 无法从带有 DISTINCT、GROUP BY 等的 View 中选择 ROWID