SQL中Deterministic确定性与Volatile挥发性函数的判定问题
结论先行
你提到的getTableCount这类依赖底层数据的函数不属于确定性函数,广义上属于非确定性/挥发性范畴,主流数据库通常会将这类函数归为稳定性介于纯确定性和纯挥发性之间的中间档。
核心判定标准
确定性函数的唯一判定逻辑是:相同输入参数下,无论任何时间、任何环境调用,返回值永远固定,完全不受任何外部状态影响。
- 确定性函数示例:
ABS(2),不管数据库其他表怎么变动、不管什么时候调用,返回值永远是2,完全和外部状态解耦。 - 纯挥发性非确定性函数示例:
NOW()、RAND(),哪怕是同一条SQL语句执行过程中多次调用,返回值都可能发生变化。
关于中间稳定性分类的说明
大部分关系型数据库的函数稳定性都会分为三档,不存在所谓的“无法分类的第三种场景”,分类规则如下:
- 不可变(IMMUTABLE):严格意义上的确定性函数,仅和输入参数有关,和所有外部状态无关,常用的字符串处理、数值计算类内置函数都属于这一档,可以安全用于函数索引、常量预计算等场景。
- 稳定(STABLE):单次查询执行过程中,相同输入的返回值固定,但跨查询可能因为底层数据变更、时间变化等外部因素发生变动。你提到的
getTableCount就属于这一档:单条SQL执行时会使用一致性快照读,同一次查询内多次调用同参数的getTableCount结果一致,但表数据变更后再次调用结果就会变。 - 挥发性(VOLATILE):最不稳定的非确定性函数,哪怕同一次查询内多次调用相同参数,返回值都可能变化,
NOW()、RAND()都属于这一档。
关于你提到的定义疑问
广义上的“非确定性/挥发性函数”确实采用「只要存在任何场景下同输入返回值可能变动,就算非确定性」的判定标准,只有IMMUTABLE级别的函数属于严格确定性函数,STABLE和VOLATILE都属于广义非确定性的范畴,只是稳定性程度不同。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

