
# 磁盘缓存主动预热调优
该功能仅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而去重新加载小表数据，语法格式支持以下三种：
1. 发生实际查询操作，并将查询的数据直接进入到Am队列。
   ```
   explain warmup hot select ...;
   ```
   ![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000002059501845.png "点击放大")
   
2. 发生实际查询操作，查询的数据按照A1in \> A1out \> Am的顺序进行。
   ```
   explain warmup select ...;
   ```
   ![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000002023418392.png "点击放大")
   
3. 不发生实际的查询操作，和之前explain逻辑保持不变。
   ```
   explain select ...；
   ```
   
 
