文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

支持语句级Function Cache

可获得性

本特性自MogDB 5.0.9版本开始引入。

特性简介

支持缓存stable/immutable类型函数结果,提高查询性能,低基数场景性能提升10倍以上。

特性描述

在执行查询时,如果语句中含有plsql等函数,函数的执行将会占用很大一部分时间。如果函数是stable/immutable的,并且函数参数出现较多重复时,将结果缓存下来可极大提升查询效率。

本特性支持在SQL执行过程中,对于第一次遇到的stable/immutable类型函数的参数,计算出结果后将其放入缓存中,后续如果遇到相同的参数,则可以直接从缓存中取出结果,省去计算过程。

参数说明

  • 新增USERSET类型GUC参数enable_cache_function_result,控制是否启用缓存,默认值为off。

    取值范围:on/off

    默认值:off

  • 新增USERSET类型GUC参数function_result_cache_max_mem,控制缓存可使用的最大内存大小,单位kb。

    取值范围:1024 ~ INT_MAX

    默认值:16*1024

特性约束

  1. 可缓存的函数条件:
    • 需要为stable/immutable类型的函数。
    • 函数的参数和结果不能包含set类型。
    • 不支持plsql中带有out参数的场景。
    • 支持除builtin外的其他所有函数类型,包括c/sql/java/plsql函数等。
  2. 判断缓存中的结果是否能重用,需要满足以下条件:
    • 函数oid相同。
    • 函数的参数个数以及类型需要相同。
  3. 对于select foo()这种类型的查询,由于结果只会被使用一次,不会进行缓存。
  4. 如果一个查询中同时包含可缓存的和不可缓存类型的函数,依旧会对可缓存类型的函数进行缓存。
  5. 函数缓存结果只在query级别生效。
  6. 并行场景下,每个worker都有自己的缓存,不共享。

示例

CREATE TABLE t_plsql_cache(a int, b varchar);
INSERT INTO t_plsql_cache VALUES (generate_series(1, 10000)/3, (generate_series(1, 10000)/3)::int::varchar);
CREATE OR REPLACE FUNCTION is_even(a int)
RETURNS int
LANGUAGE 'plpgsql'
IMMUTABLE
AS $$
BEGIN
    RETURN a%2 = 0;
END;
$$;
 
MogDB=# explain analyze select sum(is_even(a)) from t_plsql_cache;
                                                      QUERY PLAN                                                       
-----------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=2677.00..2677.01 rows=1 width=12) (actual time=873.801..873.801 rows=1 loops=1)
   ->  Seq Scan on t_plsql_cache  (cost=0.00..152.00 rows=10000 width=4) (actual time=0.023..4.404 rows=10000 loops=1)
 Total runtime: 873.917 ms
(3 rows)
 
MogDB=# set enable_cache_function_result= true;
SET
MogDB=#  explain analyze select sum(is_even(a)) from t_plsql_cache;
                                                      QUERY PLAN                                                       
-----------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=2677.00..2677.01 rows=1 width=12) (actual time=291.390..291.390 rows=1 loops=1)
   ->  Seq Scan on t_plsql_cache  (cost=0.00..152.00 rows=10000 width=4) (actual time=0.019..2.455 rows=10000 loops=1)
 Total runtime: 291.550 ms
(3 rows)

相关页面

enable_cache_function_resultfunction_result_cache_max_mem

Copyright © 2011-2024 www.enmotech.com All rights reserved.