【发布时间】:2014-11-25 08:01:04
【问题描述】:
有一个表 T(user, timestamp,...) 有 100 毫升以上的记录 (PostgreSQL 9.1)。
形式的查询
SELECT *
FROM T
WHERE user='abcd'
ORDER BY timestamp
LIMIT 1
当有大约 100000 条用户记录时,正在使用 timestamp 索引而不是用户索引。
使用时间戳索引总是会产生糟糕的结果(20+ 秒),因为它最终会扫描所有记录。通过将查询更改为使用ORDER BY DATE(timestamp) 来绕过timestamp 索引将导致查询求助于用户索引并给出小于100 毫秒的结果。
- 总内存:64 GB
- shared_buffers:16 GB
- work_mem:32 MB
为什么 postgresql 忽略 user 索引而使用 timestamp 索引(时间戳索引需要查看所有记录)?
是否有任何 postgresql 配置参数可以更改以使查询使用用户名索引本身?
【问题讨论】:
-
发布
EXPLAIN结果 -
最可能的问题 - 表上的统计信息陈旧或配置错误。
-
这是一个有效的问题,请不要关闭它!
-
@vyegorov 我不能代表另一个关闭投票,但我的投票是迁移到 dba.stackexchange.com,而不是关闭问题
标签: sql postgresql query-optimization