接下来我们会分别介绍 3 种物理路径的代价计算方法,这样读者就能跟着这种计算的过程了解代价计算的流程。需要注意的是读者朋友们可以不用过度关注计算的准确性,而是把注意力集中在 PostgreSQL 代价模型的思想上。
由于 SQL 是描述性语言,所以它只需要告诉我们执行结果,它不关心执行的过程。假如有很多可以获得执行结果的手段,那么我们当然是想获得一个效率最高的——也就是说条条大路通罗马,但我们一定要选一个最短的路来走。在 PostgreSQL 数据库中也把这些数据的访问方法称为“路径”(Path),物理优化的过程就是从众多路径中选择最优路径的过程。
比如要访问 STUDENT 表,向这个表写入 10000 行数据:
INSERT INTO STUDENT SELECT i, repeat('A', i%5 + 1), i%2 FROM GENERATE_SERIES(1,10000) i;
ANALYZE STUDENT;
目前已知:
- STUDENT 表有 10000 条数据
- STUDENT 表在 sno 上有一个主键索引
顺序扫描代价
像 STUDENT 这样的堆表,最通用的办法是把它的数据全部访问一遍,所以就可以考虑顺序扫描(SeqScan)的方式来访问这个表:
postgres=# EXPLAIN SELECT * FROM STUDENT;
QUERY PLAN
------------------------------------------------------------
本文详细介绍了PostgreSQL中顺序扫描(SeqScan)和索引扫描(IndexScan)的代价计算方法,包括IO代价和CPU代价。讨论了不同选择率、约束条件对扫描方式的影响,以及如何根据硬件环境调整代价模型。强调了顺序IO和随机IO的差异,并分析了在不同索引和约束条件下,优化器选择最优路径的策略。
订阅专栏 解锁全文

2131

被折叠的 条评论
为什么被折叠?



