cod*_*key 5 mysql sql sql-server user-defined-functions
当查询在 SELECT 或 WHERE 子句中包含对 UDF 的调用时,我注意到 MySQL 查询执行时间呈指数级性能下降。有问题的 UDF 查询本地表以返回标量值 - 因此它们不仅执行算术表达式,而且用作相关子查询。我通过简单地删除 UDF 并使用相关子查询、更复杂的连接等重写来解决了性能问题。
我想如果我只有 MySQL 的经验,我会简单地接受这一事实,调整我对 UDF 的使用并继续前进。但在使用 MySQL 之前,我在 SQL Server 上工作了 5 年以上。我构建了一个计费系统,可以处理更大的数据集,并且非常依赖标量和表值用户定义函数。这些 UDF 还执行查询(即不仅仅是算术运算)。在 SQL Server 上使用用户定义的函数时,我没有遇到这种性能损失。
我想知道这里是否有人非常了解 SQL Server 与 MySQL 内部原理,以证实或解释我目前关于两个系统上 UDF 性能差异的原因的理论。我的理论是 SQL Server 的优化器对 UDF 的评估与 MySQL 的不同。也许是因为表引擎在 MySQL 中是解耦的?或者,也许在 SQL Server 上使用 UDF 更为普遍,而 MySQL 引擎的优化器还没有发展到现在?我在想的是,也许 SQL Server 优化器将包含的 UDF 视为周围查询的一部分(如果可能),然后将其与查询的其余部分一起优化?也许我在这里有点离题,但我从未见过在 SQL Server 上使用 UDF 的这种性能损失。
任何其他人可以在这个问题上提供的信息将不胜感激。
UDF 具有已知的局限性和问题。请参阅:UDF 对 SQL Server 性能有害吗?
关于这个主题有很多文章。希望这是非订阅者访问:Beware Row-by-Row Operations in UDF Clothing