SELECT *,earth_distance(ll_to_earth(62.0,25.0),ll_to_earth(lat,lon)) AS distance FROM venues WHERE earth_distance(ll_to_earth(62.0,lon)) <= radius ORDER BY earth_distance(ll_to_earth(62.0,lon))
是否可以(并且建议)重复使用earth_distance(ll_to_earth(62.0,lon))的结果,而不是单独为SELECT,WHERE和ORDER BY子句计算它?
解决方法
ORDER BY
:
Each expression can be the name or ordinal number of an output column
(SELECT list item),or it can be an arbitrary expression formed from
input-column values.
大胆强调我的.
但是在WHERE和HAVING子句中,您只能引用基表(输入列)中的列,因此您必须拼出函数调用.
SELECT *,lon)) AS dist FROM venues WHERE earth_distance(ll_to_earth(62.0,lon)) <= radius ORDER BY distance;
如果您想知道将计算打包到CTE或子查询中是否更快,只需使用EXPLAIN ANALYZE进行测试即可. (我对此表示怀疑.)
SELECT * FROM ( SELECT *,lon)) AS dist FROM venues ) x WHERE distance <= radius ORDER BY distance;
与@Mike commented一样,通过声明函数STABLE(或IMMUTABLE),您可以通知查询计划程序,对于单个语句中的相同调用,函数调用的结果可以重复使用多次.我引用the manual here:
A STABLE function cannot modify the database and is guaranteed to
return the same results given the same arguments for all rows within a
single statement. This category allows the optimizer to optimize
multiple calls of the function to a single call.
大胆强调我的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。