描述
用户可以在SQL中设置placeholder(?表示),同时传递placeholder对应的值。Iquan内部会自动替换。
动态参数主要用于提高Plan Cache命中率,对于查询模式固定的场景性能提升明显。
注意动态参数只能替换值,不支持关键字或字段替换。
支持版本
>= Ha3 3.7.0
参数说明
用户在启用动态参数的时,需要在kvpair中设置如下的参数:
字段  | 含义  | 示例  | 支持版本  | 
iquan.plan.prepare.level  | 对指定阶段的结果使用具体的参数替换"?"号。 默认为jni.post.optimize。  | kvpair=...;iquan.plan.prepare.level:jni.post.optimize;...  | Ha3 3.7.0 ~ Ha3 3.7.2 该字段为必填字段; Beta版本支持该字段为选填字段,默认为jni.post.optimize。  | 
dynamic_params  | 填入要替换的具体值。 注意:类型一致。 注意:动态参数是一个二维数组;其中每一个一维数组对应一条SQL。  | kvpair=...;dynamic_params=[[1, 1.23, "str"]]  | 3.7.0以上版本  | 
iquan.plan.cache.enable  | 根据iquan.plan.prepare.level启用不同的cache。 在动态参数下,如果启动了cache功能,iquan会将带"?"的SQL对应的执行计划放入cache, 下次再访问同样的SQL时候,可以直接从cache中取出plan,极大的节省了时间。  | kvpair=...;iquan.plan.cache.enable:true;...  | 3.7.0以上版本  | 
示例
只启用动态参数:
SELECT i1, cast(? as bigint) FROM t1 WHERE (i2 > 5 AND d3 < 10.1) OR s5 = ?为了替换掉SQL中的动态参数(也就是"?"), 用户需要通过kvpair传入具体的参数,具体如下:
kvpair=...;
                         iquan.plan.prepare.level:jni.post.optimize;
       dynamic_params:[[10, "str5"]];
       ...;同时启用了cache和动态参数:
SELECT
    price,
    title,
    compute(
        longitude,
        latitude,
        city_id,
        CAST(? AS double),
        CAST(? AS double),
        CAST(1 AS bigint)
    ) AS distance
FROM
    store,
    unnest(store.sub_table)
WHERE
    MATCHINDEX('shop', ?)
    AND QUERY(name, ?) kvpair参数:
kvpair= ...;
                         iquan.plan.cache.enable:true;
                         iquan.plan.prepare.level:jni.post.optimize;
       dynamic_params:[[119.98844256998, 
                        36.776817017143, 
                        "excellect", 
                        "水果 OR 西瓜"]]
       ...