确定性函数和非确定性函数有什么区别?
我希望确定性会使 DBMS 认为该函数是干净的并缓存其结果?
DETERMINISTIC函数子句非常适合没有任何非确定性组件的函数。这意味着每次为函数提供相同的参数值时,结果都是相同的。当您定义一个函数时,您可以简单地将DETERMINISTIC选项添加到声明部分,确保函数(或它调用的任何函数或过程)不依赖于会话变量或模式对象的状态,因为结果可能因调用而异。此选项指示优化器在遇到先前计算的结果时可以使用缓存的结果。
资源
create function det() returns INTEGER DETERMINISTIC NO SQL return @param;
create function ndet() returns INTEGER NOT DETERMINISTIC NO SQL return @param;
select
@param:=5, det() d1, ndet() n1
, @param:=3, det() d2, ndet() n2
, @param:=1, det() d3, ndet() n3
, @param:=7, det() d4, ndet() n4;
结果:
5, 5, 5, 3, 3, 3, 1, 1, 1, 7, 7, 7
那些。我看不出有什么不同。
如何理解有什么区别,它在什么情况下表现出来?
如果定义
DETERMINISTIC,则表示对于相同的参数,函数总是返回相同的值。因此,理论上,MySQL 可以缓存该值,以免为相同的参数重新计算它。但是
DETERMINISTIC在 MySQL 中的支持并没有完全实现,函数总是会被执行。MySQL 5.7.22 上的示例:
In
WHERE执行 1 次:例如,它将显示 ,
1 | 2 | 3即没有“攻击”。在我看来,在这种形式下,这两个函数显然都是非确定性的,因为 取决于不是函数参数的外部变量...
@param如果你这样写函数:
那么它(在我看来)可以被认为是确定性的,因为 当使用相同的参数调用时,保证返回相同的结果...