金仓数据库KingbaseES PLSQL创建函数IMMUTABLE STABLE VOLATILE参数详解
关键字:
Create function、IMMUTABLE、人大金仓、KingbaseES
IMMUTABLE STABLE VOLATILE参数的定义及作用
在Kingbase中,IMMUTABLE、STABLE、VOLATILE是函数不变性标记,它们用于描述函数的行为和优化器如何处理这些函数。用于说明函数对于相同的输入参数是否产生相同的结果,以及它们是否依赖于外部因素,以下是这些标记的定义及作用。
1.IMMUTABLE:当将此参数作用于函数时,表示该函数在相同的输入下始终返回相同的结果。这是因为函数不依赖于数据库的状态或者外部因素,它只依赖于其输入参数。这允许kingbase在查询中进行更好的优化,因为它知道函数的结果不会随时间或数据的更改而变化。
2.STABLE:这个参数表示函数的结果在同一查询中对于相同的输入参数是稳定的。函数可以访问外部数据,但只要输入相同,输出也会相同。这比IMMUTABLE较弱,但仍有助于查询优化。
3.VOLATILE:当函数的结果随时间、数据或外部状态变化而变化时,使用此参数,这表示函数不是纯粹的,其结果可能因为外部因素而变化,因此不能被返回或重用。
IMMUTABLE STABLE VOLATILE参数的使用场景介绍
1.IMMUTABLE:
- 地理坐标转换函数:如果您有一个函数,将经纬度坐标转换为距离或区域,这个函数可以被标记为IMMUTABLE,因为相同的经纬度输入将始终生成相同的输出,不受数据库状态或时间影响。
- 日期格式转换函数:将日期从一种格式转换成另一种格式的函数可以标记为IMMUTABLE,因为它不依赖于外部状态。
2.STABLE:
- 用户名称解析函数:如果有一个函数,将用户id转换为其用户名,这个参数可以标记为STABLE,因为在同一查询中名相同的用户id将产生相同的用户名,结果也会更改,所以它不是IMMUTABLE。
- 当天的星期函数:返回当前日期是星期几的函数可以被标记为STABLE,因为在同一查询中对于相同的日期参数,结果是稳定的。
3.VOLATILE:
- 随机数生成函数:一个生成随机数的函数应该被标记为VOLATILE,因为其结果在不同的调用之间是不可预测的,不受输入参数的影响。
- 当前时间函数:返回当前时间的函数通常被标记为VOLATILE,因为它在每次调用时都会产生不同的结果。
在这些示例中,函数的选择有助于优化器更好的了解函数的性质,从而决定如何执行查询和缓存结果。这可以显著影响性能和查询计划的效率。
IMMUTABLE STABLE VOLATILE参数对查询计划成本影响的示例
我们将创建一个返回当前时间的函数,并将其分别标记为IMMUTABLE、STABLE、VOLATILE。然后分析查询计划查看成本差异。
函数如下:
\set SQLTERM /
create or replace function func1() returns TIMESTAMPTZ as
begin
RETURN now();
end;
/
\set SQLTERM ;
explain select func1();
drop function func1;
将它分别标记为IMMUTABLE、STABLE、VOLATILE并执行:
如上所示,设置不同的参数会导致成本估算不同,通常,IMMUTABLE函数的成本较低,因为它们被认为是不依赖外部因素的,而VOLATILE函数的成本较高,因为它们被认为会在每次调用时产生不同的结果。
请注意,实际成本会根据数据库的具体配置和版本而异。
- 总结
如果不正确的使用这些参数,可能会导致查询计划错误,或者产生性能问题,造成不必要的开销,因此,正确的设置这些参数是十分重要的。这些标记有助于数据库优化器更好的了解函数的性质,从而生成更有效的查询计划。