【问题标题】:Optimizing a stored function call in SELECT and WHERE clauses优化 SELECT 和 WHERE 子句中的存储函数调用
【发布时间】:2012-06-14 05:03:24
【问题描述】:

我有一个结构如下的 SQL 查询:

SELECT *, storedfunc(param, table.field) as f 
FROM table 
WHERE storedfunc(param, table.field) < value 
ORDER BY storedfunc(param, table.field);

有没有办法优化这个消除几个函数调用?还是 MySQL 在幕后进行这样的优化?事实上,该函数被声明为确定性的。

我还需要提到函数参数部分来自选定表的列。我稍微更改了示例以反映这一点。

【问题讨论】:

  • param是表中的列还是参数?

标签: mysql stored-functions


【解决方案1】:

重写并测试哪个执行得更快:

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
WHERE storedfunc(param, table.column) < value 
ORDER BY f ;

SELECT *
FROM
  ( SELECT *, storedfunc(param, table.column) AS f 
    FROM table 
  ) AS tmp
WHERE f < value 
ORDER BY f ;

在 MySQL 中,你甚至可以这样写(警告:不是标准 SQL 语法):

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
HAVING f < value 
ORDER BY f ;

【讨论】:

  • 奇怪的是,我尝试了后者,但 MySQL 显示错误。会再试一次。
  • 您能准确地发布您尝试过的内容吗?错误信息是什么?
  • 事实上,我在where子句中尝试了f,而不是在having中,这就是它产生错误的原因。无论如何,由于deterministic 函数声明,MySQL 是否会自动执行优化?
  • 不确定,必须测试一下。它可能取决于 MySQL 的版本。较新的版本有更好的机会执行优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多