当查询在 SELECT 或 WHERE 子句中包含对 UDF 的调用时,我注意到 MySQL 查询执行时间呈指数级性能下降。有问题的 UDF 查询本地表以返回标量值 - 因此它们不仅执行算术表达式,而且充当相关子查询。我通过简单地删除 UDF 并使用相关子查询、更复杂的连接等重写来解决了性能问题。
我想如果我只有使用 MySQL 的经验,我会简单地接受这一点,调整我对 UDF 的使用并继续前进。但在使用 MySQL 之前,我在 SQL Server 上工作了 5 年以上。我构建了一个计费系统来处理更大的数据集,并且非常依赖标量和表值用户定义的函数。这些 UDF 还执行查询(即不仅仅是算术运算)。在 SQL Server 上使用用户定义的函数时,我没有遇到这种性能损失。
我想知道的是,这里是否有人足够了解 SQL Server 与 MySQL 的内部结构,可以证实或解释我目前关于 UDF 在两个系统上的性能差异的原因的理论。我的理论是 SQL Server 的优化器评估 UDF 的方式与 MySQL 的不同。也许是因为表引擎在 MySQL 中解耦了?或者,UDF 在 SQL Server 上的使用更为普遍,而 MySQL 引擎的优化器还没有发展到这么远?我在想的是,也许 SQL Server 优化器将包含的 UDF 视为周围查询的一部分(如果可能),然后将其与查询的其余部分一起优化?也许我在这里有点离题,但我只是从未见过在 SQL Server 上使用 UDF 会造成这种性能下降。
其他人可以在此问题上发表的任何见解将不胜感激。