GaussDB解读:Partial Result Cachev缓存中间结果对算子进行加速( 二 )


优化器如何选择PTRC?
优化器在为算子选择PTRC的时候会依赖代价估算 , 主要是看命中率(命中率=不同键值的行数/键值的总行数) , 如果命中率大于rds_partial_result_cache_cost_threshold(具体含义参考下文的系统变量介绍)变量定义的最小代价 , PTRC将会被选择 , 反之则不会被选择 。 是否选择了PTRC , 可以通过Explainformat=tree或者Explainanalyze来观察实际的命中情况 。 我们通过一个例子来说明:
EXPLAINanalyze
SELECT*FROMt1WHEREt1.aIN(SELECTaFROMt2,t3WHEREt2.b=t1.bANDt2.c>t3.d);
->Filter:(t1.a,(select#2))(cost=0.35rows=1)(actualtime=3800.595..3800.595rows=0loops=1)
->Tablescanont1(cost=0.35rows=1)(actualtime=0.064..0.093rows=1loops=1)
->Select#2(subqueryincondition;dependent)
->Resultcache:cachekeys(t1.a,t1.b)(CacheHits:0,CacheMisses:1,CacheEvictions:0,CacheOverflows:0,MemoryUsage:40960)(actualtime=0.115..0.115rows=0loops=1)
->Limit:1row(s)(cost=0.80rows=1)(actualtime=0.094..0.094rows=0loops=1)
->Filter:(t2.c>t3.d)(cost=0.80rows=1)(actualtime=0.093..0.093rows=0loops=1)
->Innerhashjoin(nocondition)(cost=0.80rows=1)(actualtime=0.092..0.092rows=0loops=1)
->Tablescanont3(cost=0.35rows=2)(neverexecuted)
->Hash
->Filter:((t2.b=t1.b)and((t1.a)=t1.a))(cost=0.35rows=1)(actualtime=0.039..0.039rows=0loops=1)
->Tablescanont2(cost=0.35rows=1)(actualtime=0.038..0.038rows=0loops=1)
从Resultcache这个算子后面可以看到:
由于优化器使用代价估算来计算是否使用PTRC , 如果估算错误的话 , PTRC还是有额外的代价 , 比如创建自身的一些数据结构 , 以及记录的拷贝 。 为了尽可能的保证查询的性能 , PTRC采取了动态反馈的方式来查看PTRC在实际执行的过程中是否继续使用 。 PTRC会自动判断命中率是否适合保留PTRC , 优化器根据没有命中的次数 , 每隔rds_partial_result_cache_hit_ratio_frequency会检查命中率是否低于rds_partial_result_cache_min_hit_ratio 。 如果低于该值 , 优化器会自动禁止继续使用PTRC 。
优化器如何限制PTRC的内存使用
由于单个查询可以有多个PTRC算子 , 每个算子都会使用内存来存储缓存数据 , 那么控制PTRC内存使用就非常有必要 , 以防止内存OOM 。
通过系统变量rds_partial_result_cache_max_mem_size来定义每个查询所使用的所有PTRC算子使用的最大内存 。 如果PTRC使用的内存总数超过该值 , 优化器会根据LRU算法来进行淘汰 。 如果通过LRU算法可以找到适合当前存储记录的大小的记录进行淘汰 , 当前记录可以进行缓存 , 否则当前记录将不被缓存 。
PTRC如何配置?
首先 , PTRC默认是开启的 , 可以通过Optimizer_switch中的partial_result_cache选项更改设置:设置为ON , 启用PTRC , 否则就关闭 。 通过下表中的4个系统变量 , 对PTRC进行具体设置 。
变量名说明rds_partial_result_cache_max_mem_size最大允许使用的内存大小rds_partial_result_cache_cost_threshold优化器选择PTRC的最小代价 。 如果优化器估算的代价超过该阈值 , PTRC将会被选择 , 否则不会被选择rds_partial_result_cache_min_hit_ratio执行期间的最小命中率 。 如果命中率低于该值 , PTRC将被动态关闭rds_partial_result_cache_hit_ratio_frequency执行期间检查命中率的频率 。 如果不能命中的次数达到了该值 , PTRC将会触发检查命中率是否低于最小命中率 。 如果低于最小命中率 , PTRC将自动失效 。
变量名
说明
rds_partial_result_cache_max_mem_size
最大允许使用的内存大小
rds_partial_result_cache_cost_threshold
优化器选择PTRC的最小代价 。 如果优化器估算的代价超过该阈值 , PTRC将会被选择 , 否则不会被选择
rds_partial_result_cache_min_hit_ratio