首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否计算不更改每一行的值?

问是否计算不更改每一行的值?
EN

Database Administration用户
提问于 2018-05-03 08:37:32
回答 3查看 148关注 0票数 4

考虑使用以下WHERE子句的SQL查询:

代码语言:javascript
复制
WHERE expires >= DATE_FORMAT(NOW(), '%Y%m%d')

是为每一行重新计算DATE_FORMAT()的结果,还是为每一行计算一次?如果是后者,我可以用Python计算值,然后将其注入发送到MySQL的SQL中。

由于应用程序的限制,这个值实际上是一个LONGTEXT列,这个问题是问题的简化。由于表的EAV性质,数据必须存储在此列类型中。

这个问题涉及到MySQL 5.7,但是如果其他数据库管理系统,特别是SQLite或Postgres有不同的行为,我也希望知道这一点。谢谢。

EN

回答 3

Database Administration用户

发布于 2018-05-03 20:27:51

只要它作为单个事务运行,该值将在每一行上重新使用,而不是重新计算。对于Postgres或SQL,我不是百分之百肯定,但我相当有信心(98%)它们将同样工作。

在过去,当我对这个问题比较困惑时,我会将日期值预取到一个变量,然后在where子句中重用该变量。现在,我意识到这是没有意义的,除非我在一组更长的语句中有不止一个位置来使用这个值。

作为测试,将计算的日期值移到select子句,并对一个大表执行,该表需要超过几秒钟的时间才能返回。您会注意到,第一行的日期/时间值与最后一条记录相同。

票数 3
EN

Database Administration用户

发布于 2018-05-20 23:38:23

只对DATE_FORMAT(NOW(), '%Y%m%d')进行一次评估。

DATE_FORMAT(expires, '%Y%m%d')被重新评估,所以效率很低。

类似地,即使这个看似简单的表达式也非常低效:

代码语言:javascript
复制
WHERE YEAR(my_date_column) = 2017

通过改变它,您可能可以使用一个索引:

代码语言:javascript
复制
WHERE my_date_column >= '2017-01-01'
  AND my_date_column  < '2017-01-01' + INTERVAL 1 YEAR

(这个答案适用于MySQL/MariaDB;我不知道其他供应商是否进行了一些优化。)

票数 2
EN

Database Administration用户

发布于 2018-05-21 05:51:41

是为每一行重新计算DATE_FORMAT()的结果,还是为每一行计算一次?

此值只计算一次。

NOW()函数在启动查询处理时返回时点的日期时间值(请参阅函数NOW()描述)。在不依赖于行处理的所有查询执行过程中,它是一个常量(与为每一行计算的SYSDATE()和在处理当前行时返回的时间点不同)。

在大多数关系数据库管理系统中,根本没有类似的SYSDATE()函数(因为它是不确定的),因此它们在处理有关语句的查询时的行为是完全相同的--得到的值被认为是一个常数,并且只计算一次。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/205675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档