接下来我们会分别介绍 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=# EXPLA