当查询在SELECT或WHERE子句中包含对UDF的调用时,我注意到在MySQL查询执行时间中出现了指数级性能下降。UDF对本地表进行查询以返回标量值,因此它们不仅执行算术表达式,而且充当相关的子查询。通过简单地删除UDF并使用相关的子查询、更复杂的联接等重写,我解决了性能问题。
我想,如果我有使用MySQL的经验,我会简单地接受这一事实,调整我对UDF的使用,然后继续前进。但在使用MySQL之前,我在Server上工作了多年5+。我建立了一个计费系统,它处理更大的数据集,并且非常依赖于标量和表值用户定义的函数。这些UDF还执行查询(即不仅仅是算术操作)。在Server上使用用户定义的函数时,我没有遇到这种性能损失。
我想知道的是,这里是否有人非常了解Server和MySQL的内部结构,足以证实或解释我目前关于UDF在这两个系统上性能差异的原因的理论。我的理论是,Server的优化器对UDF的评估与MySQL的评估不同。也许是因为表引擎在MySQL中是解耦的吧?或者,在Server上使用UDF更普遍,而MySQL引擎的优化器还没有进化到目前为止?我想的是,也许SQL Server优化器将包括的UDF作为周围查询的一部分(如果可能的话),然后与查询的其余部分一起优化它?也许我在这里做得太离谱了,但我从来没有见过在SQL Server上使用UDF会带来这样的性能问题。
其他人在这个问题上所能提供的任何意见都将受到赞赏。
发布于 2009-08-05 02:10:12
UDF有其局限性和问题。请参阅:UDF对Server性能有害吗?
关于这个话题有很多文章。希望这是一个非订户接入:小心UDF服装的逐行作业。
发布于 2018-06-06 00:23:49
我知道这是一个老问题,但在谷歌搜索"MySQL UDF性能“时,它首先出现,而且还没有一个足够的答案--公认答案中的一个链接被破坏,另一个似乎没有讨论MySQL UDF的具体内容。
首先,让我们确定我们正在讨论的是实际的MySQL UDF。在MySQL中,“存储函数”和UDF是有区别的。使用内部存储函数/过程解释器运行存储函数。UDF是用C++编写的,编译成共享库,由MySQL服务器加载到内存中,当调用时,它作为机器代码在CPU上运行。因此,UDF性能通常比存储函数的性能好数量级。
因此,首先,确保您正在讨论的是实际的UDF,而这不是存储的函数。
其次,MySQL的UDF性能取决于它正在执行的算法的性质及其实现的质量。例如,如果您的UDF正在测试1000个字节长的字符串的所有可能的三重奏字符,它将检查10亿个组合,每一行大约需要几秒钟。因此,如果删除UDF使代码运行速度大大加快,那么下一步就是调试UDF本身,以确保它是最优编写的--或者UDF试图回答的问题不能很快得到回答。
尽管如此,一个写得很好的UDF回答了一个相对简单的问题,与提供数据分析所需的I/O相比,通常是轻快的。
https://stackoverflow.com/questions/1230787
复制相似问题