PG:查询计划器与random_page_cost
查询计划器与random_page_cost
本周小贴士比较奇怪,基于我们今天遇到的一个问题。将简讯的链接存储到一个简单数据库中:
CREATE TABLE links (
uid CHAR(60) PRIMARY KEY,
data TEXT,
timestamp INT
)
CREATE INDEX idx_trgm ON links USING GIN (data gin_trgm_ops)
当然,这个设计比较烂。但仅供内部使用,我只是一个粗略的想法原型。数据是一个包含json(I know, I know...)的文本,以同样可怕的方式检查链接的存在:
SELECT * FROM links WHERE data ILIKE '%whatever we want%' LIMIT 1;
在低容量下运行很好,但查询时间偶尔会超过300ms,很好奇这是为啥?
执行EXPLAIN ANALYZE后,发现PG根本没使用GIN索引,而是使用了全表扫描。但是如果去掉LMIT 1,查询将使用索引,执行只需要5ms。为什么PG会忽略索引?
PG的查询规划器并不是真正基于人们做一些荒唐的事情。比如使用ILIKE进行全表扫描,关心的是走索引快还是全表扫描快。变量random_page_cost用于决定使用索引的代价是否值得,或者和seq_page_cost合作使用。
这种情况下,索引扫描是值得的,但是查询规划器不同意。因为看起来很简单的LIMIT 1,只找到一个结果就可以停止。并继续进行全表扫描。
SET random_page_cost = 1;
EXPLAIN ANALYZE SELECT * ... LIMIT 1;
[see the index being used]
SET random_page_cost = DEFAULT;
EXPLAIN ANALYZE SELECT * ... LIMIT 1;
[see the index NOT being used]
除了明显的“修复那个糟糕的模式”,看看PG会做什么,如果觉得索引扫描和顺序扫描比代价低。因此如果最终得到的查询使用索引,那么有必要尝试一下,通过EXPLAIN ANALYZE分析。
最新活动更多
-
10 阿里AI需要算一笔账了
- 1 GPT-6要来了,但AI行业早不跟 OpenAI玩了
- 2 火爆的“Token经济学”,关乎你的钱包、职场和未来消费 | 人人能懂的产业报告
- 3 资本巨头纷纷抽身,为何中小投资者仍为AI狂热加码?
- 4 大厂财报中的AI图鉴:营收单列、玩杠杆、商业画饼
- 5 从百度到Meta,科技巨头的 AI 组织战,开打了
- 6 2026年3月,国内具身智能机器人企业融资汇总
- 7 华勤财报发布:收入规模破1700亿,利润增长近40%
- 8 宇树科技招股书透视:中外具身智能玩家生存竞速
- 9 大涨30%!智谱 AI 财报出炉:营收暴增132%,API 增长3倍,市值破 4000 亿
- 10 谷歌Gemma 4遭破解!实测:伪造支票、找盗版电影,有求必应


分享














发表评论
登录
手机
验证码
手机/邮箱/用户名
密码
立即登录即可访问所有OFweek服务
还不是会员?免费注册
忘记密码其他方式
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论