我有类似如下的查询:
-- MySQL Query
SELECT * FROM table1 WHERE start_date >= CURRENT_TIMESTAMP - INTERVAL 7 DAY
-- MSSQL Query
SELECT * FROM table1 WHERE start_date >= GETDATE() - 7由于右侧的表达式不依赖于列值,我是否应该期望查询优化器将其优化为常量值,例如:
SELECT * FROM table1 WHERE start_date >= '2012-04-28 14:54:31'或者我应该计算常量并使用代码构建查询。
发布于 2012-05-05 18:23:37
根据MySQL的NOW()函数( CURRENT_TIMESTAMP是其同义词)的文档:
NOW()返回一个常量时间,指示语句开始执行的时间。(在存储的函数或触发器中,NOW()返回函数或触发语句开始执行的时间。)这与SYSDATE()的行为不同,后者返回执行的确切时间。
因此,查询优化器会根据需要将其视为常量。用户可以在EXPLAIN输出中使用see this命令。
我不能为MSSQL说话,尽管也许this blog值得一读?
发布于 2012-05-05 18:15:56
右边有一个函数,而不是常量。每次都必须重新计算查询...
(我有没有漏掉一点??)
编辑
就像@Martin和@eggyval亲切地解释说,我确实漏掉了一点。这个问题显然不是关于编译时优化的,所以我把这句糟糕的话留下来作为纪念,以纪念像我这样的混蛋会发生什么……
https://stackoverflow.com/questions/10460812
复制相似问题