postgresql - 为什么 SELECT COUNT(DISTINCT) 中不使用索引?
问题描述
这就是我在 PostgreSQL 10.9 ( x
is VARCHAR(100)
) 中所做的:
SELECT COUNT(DISTINCT x) FROM t
该表有超过 150 万条记录,并且有一个索引:
CREATE INDEX idx_1 ON t USING btree (x)
该请求需要 7 秒以上。这EXPLAIN
就是说:
Aggregate (cost=23675.97..23675.97 rows=1 width=8)
->; Seq Scan on t (cost=0.00..22930.97 rows=1489990 width=23)
怎么了?为什么不使用索引?
解决方案
这取决于两个因素:
- 表是否有“宽行”
- 桌子是否被吸尘
无论如何,查询必须扫描整个索引或整个表,因为 PostgreSQL 中没有索引跳过扫描。
PostgreSQL 可以扫描索引或表。
如果表最近没有被清理,索引扫描将始终必须访问表以确定该行是否可见。在这种情况下,顺序扫描总是会更快。
如果表最近被清理过,并且可见性地图的大多数块都标记为“全部可见”,那么您可以获得仅索引扫描。
如果表行很窄,您不太可能只扫描索引,因为读取索引不会比读取表便宜(顺序读取更快)。
对于具有宽行的表,您将获得仅索引扫描。
推荐阅读
- android - 使用 CompanionDeviceManager 读取设备信息
- sql - 当列名的末尾没有“Id”似乎是外键时,这意味着什么?
- python - 如何解决 input() 中的问题?(Python)
- angular - 离子延迟加载,路线不工作,离开后
- angularjs - AngularJS + BootstrapUI:自动完成未加载选项
- mongodb - 如何修复来自 perl mongodb 脚本的警告错误
- python - 类型错误:split() 缺少 1 个必需的位置参数:'split_size'
- python - Spyder 未在 anaconda 上启动并返回错误
- html - 使包装器元素相对时覆盖绝对元素
- fonts - 在 xterm 中使用后备字体