查询视图未选取内联函数生成的列时该函数是否会执行?
结论
这个问题没有跨所有数据库的统一标准答案,my_custom_function会不会执行,完全取决于你当前使用的数据库的查询优化器实现逻辑,以及这个自定义函数本身的属性。
两种典型场景
- 不会执行的情况
对PostgreSQL、SQL Server、Oracle这类优化器实现比较成熟的数据库来说,执行带视图的查询时,会先把视图定义展开做查询重写,自动做列裁剪优化:既然最终查询只需要返回colA、colB,完全用不到colC的计算结果,优化器会直接把my_custom_function(colA)这段计算逻辑从执行计划里删掉,函数根本不会被调用。 - 会执行的情况
第一种是部分轻量化数据库、早期版本的数据库(比如MySQL 5.x的部分场景)没有实现视图场景下的列裁剪逻辑,会先把视图定义里的所有列全量计算完成,再筛选你要的列返回,这种情况下函数一定会执行。
第二种是哪怕数据库支持列裁剪,只要my_custom_function被标记为易变函数(VOLATILE)——也就是函数执行本身存在副作用,比如函数内部会写操作日志、修改表数据、调用自增序列、生成随机值,执行函数本身就会产生预期的业务影响——优化器为了保证逻辑正确性,不会随意裁剪掉这个函数调用,就算你不用它的返回值,也会按逻辑执行函数。
验证方式
想确认你当前环境的实际行为非常简单:
- 直接查看执行计划:对应数据库执行
EXPLAIN类命令查看执行计划节点,如果节点里没有出现my_custom_function的调用逻辑,就说明函数不会执行; - 实测验证:在自定义函数内部加一行插入日志表的逻辑,跑一遍查询后看日志表有没有新增记录,结果100%准确。
内容的提问来源于stack exchange,提问作者Travis Peterson
相关产品推荐
相关产品推荐

