当查询在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的这种性能打击.
其他人可以解决这个问题的任何亮点将不胜感激.
解决方法:
标签:mysql,sql,sql-server,user-defined-functions
来源: https://codeday.me/bug/20190701/1344520.html