您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

查询参数化:BIND_AS_PARAMETER 和 BIND_AS_VALUE

过程、函数或匿名块查询中使用的所有标量变量在查询编译期间都表示为查询参数或常量值。应选择哪个选项是优化器的决策。

示例

以下过程在嵌套查询的 WHERE 子句中使用两个标量变量( var1 和 var2 )。 示例代码CREATE PROCEDURE PROC (IN var1 INT, IN var2 INT, OUT tab mytab)ASBEGIN tab = SELECT * FROM MYTAB WHERE MYCOL >:var1 OR MYCOL =:var2;END; 通过在可调用语句中使用查询参数调用过程 示例代码CALL PROC (var1=>?, var2=>?, mytab=>?) 将使用标量参数的查询参数准备表变量标签的嵌套查询: 示例代码SELECT * FROM MYTAB WHERE MYCOL >? OR MYCOL =?

在执行查询之前,参数值将绑定到查询参数。

调用不带查询参数的过程,并直接使用常量值 示例代码CALL PROC (var1=>1, var2=>2, mytab=>?) 将生成以下直接使用参数值的查询字符串: 示例代码SELECT * FROM MYTAB WHERE MYCOL >1 OR MYCOL =2;

使用查询参数的优势在于,即使变量 var1 和 var2 的值发生更改,也可以使用生成的查询计划缓存条目。

潜在的缺点是,由于使用参数值的优化无法在编译期间直接执行,因此有可能没有获得最优化的查询计划。使用常量值将始终导致准备新的查询计划,因此不同参数值的查询计划缓存条目也不同。这伴随着查询准备的额外时间,以及快速变化的参数值场景中潜在的高速缓存淹没影响。

为了显式控制标量参数的参数化行为,可以使用函数 BIND_AS_PARAMETER 和 BIND_AS_VALUE。使用这些功能时,将覆盖优化器的决策和常规配置。

语法

 ::= BIND_AS_PARAMETER (  )|

BIND_AS_VALUE( )

在查询准备期间,使用 BIND_AS_PARAMETER 将始终使用查询参数表示

在查询准备期间,使用 BIND_AS_VALUE 将始终使用值表示

以下示例表示上述过程,但现在使用函数 BIND_AS_PARAMETER 和 BIND_AS_VALUE,而不是直接引用标量参数: 示例代码CREATE PROCEDURE PROC (IN var1 INT, IN var2 INT, OUT tab mytab) AS BEGIN tab = SELECT * FROM MYTAB WHERE MYCOL > BIND_AS_PARAMETER(:var1) OR MYCOL = BIND_AS_VALUE(:var2); END; 如果再次调用过程时使用 示例代码CALL PROC (var1=>?, var2=>?, mytab=>?) 并绑定值(1 表示 var1 ,2 用于 var2 ),将准备以下查询字符串 示例代码SELECT * FROM MYTAB WHERE MYCOL >? OR MYCOL = 2; 即使使用常量值调用此过程,也会准备相同的查询字符串,因为 函数会覆盖优化器的决策。 示例代码CALL PROC (var1=>1, var2=>2, mytab=>?)