物理计划优化
1.Zone Map¶
从磁盘中获取Page的速度没有办法增加,其速度上线取决于磁盘的速度。
Zone Map的思想史是为每个Page维护一些元数据,通过元数据来提前决定需不需要访问该数据。
Zone Map维护了Page的元数据,如存放于该Page中Tuple的Min、Max、Count值。
当我们想要利用Where过滤出一张表中Value大于100的Tuple,在获取Page之前,我们就可以通过Zone Map提前查看Value的Max值。如果所有Value的Max值都小于等于100,那么该Page就没有获取的必要。
Zone Map可以存放于Page自身,但是这就需要获取Page才能得到它的元数据。更好的方式是专门维护一个Zone Map Table,用于跟踪各个Page的信息。
3.Index Scan¶
对于一个查询来说,若该表拥有多个可用的索引,需要如何选择索引?
选择索引的依据常有:
- 该索引拥有什么属性
- 该查询中用到了什么属性
- 这些属性值实际是什么
- 该索引对于查询来说,是否能够更优化查询。即是否更有有选择性,能够让我们减少读取Tuple的数量。
- 判断条件是什么
- 这是唯一索引还是非唯一索引
4.Multi-Index Scan¶
如果发现多个索引的选择性都差不多,那么我们希望可以通过这些不同的索引进行查询,然后将多个索引得到的结果进行合并。
Postgres称之为Bitmap Scan。它们通过将结果的Tuple以Bitmap的形式展示,然后将多个Bitmap进行合并。如果是And语句则使用或运算、or语句则使用与运算。
5.Index Scan Page Sorting¶
如果顺序扫描基于的索引不是聚簇索引,即扫描需要对主键的索引进行回表的话,那么使用该索引进行顺序扫描时可能会随机跳转到不同的page中。
假设聚簇索引需要扫描的tuple对应的pageid为0、0、1、1、2、2,此时顺序扫描所使用的非局促索引排序为0、1、2、0、1、2,那么极端情况下,缓存池若只能容纳一个page,就会产生六次磁盘I/O。
若在扫描前,将需要扫描的tuple的pageid根据聚簇索引的顺序进行排序,就可以减少磁盘I/O至三次。