磁盘缓存主动预热调优
该功能仅9.1.0.200及以上版本支持。
背景介绍
当前存算分离架构为了降低存储成本会将用户数据存储到obs,这样会导致用户每次查询数据时都要发生网络IO去obs取数据,因此当前存算分离架构提供了磁盘缓存的能力,将用户预查询的数据缓存到本地磁盘,当实际查询数据流程时,数据已经缓存在本地,从而提升查询速度,在降低用户存储成本的同时尽可能的降低性能损耗。
当前采用了LRU2Q的算法来管理磁盘缓存。LRU2Q共包含3个队列,分别是A1in/A1out/Am,其中数据首次命中时会进入到A1in队列中,后续如果A1in队列满了(可调整guc参数,通常默认值为整个队列大小的0.25倍),会淘汰到A1out(实际并不存储数据到缓存,只是A1in队列淘汰的延长记忆),等A1out队列中的block被命中时,才会插入到Am队列。在Am队列中的数据,是最热的数据。
上述LRU2Q的淘汰策略对普通查询来说已经足够了,但是可能会存在的场景是:用户会将一些大表(比如查询数据接近磁盘缓存大小)和一些小表频繁join,此时如果继续按照普通LRU2Q的淘汰策略,对于频繁使用的小表来说可能会发生A1in满了然后淘汰到A1out,再次命中进入Am的过程,这样会频繁发生网络IO去重新缓存小表的数据,此时会极大的降低大表join小表的性能。
调优语法
当前提供了一种新的调优策略,即允许用户将上述描述场景中的小表数据直接入到Am队列中,保证小表的数据一直是热数据,join时不会频繁的发生网络IO而去重新加载小表数据,语法格式支持以下三种:
- 发生实际查询操作,并将查询的数据直接进入到Am队列。
explain warmup hot select ...;
- 发生实际查询操作,查询的数据按照A1in > A1out > Am的顺序进行。
explain warmup select ...;
- 不发生实际的查询操作,和之前explain逻辑保持不变。
explain select ...;