当前位置: 首页 > 面试题库 >

SQL Server是否在选择查询中优化DATEADD计算?

华泳
2023-03-14
问题内容

我在Sql Server 2008上有这样的查询:

DECLARE @START_DATE DATETIME
SET @START_DATE = GETDATE()

SELECT * FROM MY_TABLE
WHERE TRANSACTION_DATE_TIME > DATEADD(MINUTE, -1440, @START_DATE)

在上面看到的选择查询中,SqlServer是否优化查询以免一次又一次地计算DATEADD结果。还是将DATEADD结果存储在临时变量中是我自己的责任吗?


问题答案:

令人惊讶的是,我发现内联使用GETDATE()似乎比预先执行这种类型的计算更有效。

DECLARE @sd1 DATETIME, @sd2 DATETIME;
SET @sd1 = GETDATE();

SELECT * FROM dbo.table
WHERE datetime_column > DATEADD(MINUTE, -1440, @sd1)

SELECT * FROM dbo.table
WHERE datetime_column > DATEADD(MINUTE, -1440, GETDATE())

SET @sd2 = DATEADD(MINUTE, -1440, @sd1);

SELECT * FROM dbo.table
WHERE datetime_column > @sd2;

如果您检查这些计划,则中间查询将始终以最低的成本(但并非总是最低的花费时间)出现。当然,这可能取决于您的索引和数据,并且您不应基于一个查询做出任何假设,即相同的抢先式优化将对另一查询起作用。我的本能是不执行任何内联计算,而是使用@sd2上面的变体…但是我了解到我不能一直相信我的本能,也无法基于我所经历的行为做出一般性的假设。特定情况。



 类似资料:
  • 问题内容: 说我们有一张桌子: 填充一些行: 我想确定何时更改了值。所以我的查询结果应该是: 我有一个连接和子查询的解决方案: 但这是非常低效的,并且对于具有许多行的表将非常慢地工作。 我相信使用PostgreSQL窗口函数可能会有更有效的解决方案? SQL小提琴 问题答案: 这就是我如何通过分析来做到这一点: 更新(一些解释): 分析功能充当后处理步骤。查询结果分为多个分组(),并且在分组的上下

  • 在实际操作中,查询中存在多个查询,因此需要使用CriteriaBuilder构造查询。到目前为止,我得到的最接近的方法是使子查询中选择a,但这不限于,当然: 在Subquery上有许多方法,我想知道是否需要将实体与其属性连接到外部查询中,然后以某种方式将correlate(),但我从EE7 javadocs中不确定correlate()到底做了什么(但correlate()返回一个from,这意味

  • 问题内容: 我想运行以下查询: 以下查询(来自主查询的子查询): 在7秒内执行,从210万行的表中产生了2691行。 我在上面触发了 主查询 ,并且在等待5分钟以上之后它仍在执行。 最后,我分别执行了子查询,从结果中提取了2691条记录,执行了以下查询: 令人惊讶的是,这在40秒内给了我一个答案。 是什么赋予了?为什么MySQL不使用我使用的相同技术并迅速给出答案?难道我做错了什么? 问题答案:

  • 我创建了一个包含标题字段和文本字段的文档弹性搜索索引。给定一个查询,我的搜索的期望行为是首先检查title字段,如果有任何文档的标题与查询“良好”匹配,那么这些文档必须排在前面。只有在良好的标题匹配之后,才应该返回具有良好文本匹配的文档。 通过“良好的标题匹配”,我的意思是类似于“查询接近标题的某个子集,其中接近意味着levinshtein距离小于某个给定数字”。这是一个阈值条件。因此,标题要么是

  • 问题内容: 一位新同事刚刚建议在Hibernate中使用带有注释(即@NamedQuery)的命名HQL查询,而不是将HQL嵌入到我们的XxxxRepository类中。 我想知道的是,使用注释是否可以提供集中查询以外的任何优势? 特别是,是否有一些性能提升,例如因为查询仅在加载类时解析一次,而不是每次执行Repository方法时解析一次? 问题答案: 来自Pro EJB 3(Mike Keit

  • 问题内容: 我有一个Oracle表,其中包含一组范围(RangeA和RangeB)。这些列是varchar,因为它们可以同时容纳数字和字母数字值,如以下示例所示: 我需要执行一个查询,该查询仅返回具有数值的记录,并对该查询执行Count。到目前为止,我已经尝试过使用两个不同的查询来做到这一点,但没有任何运气: 查询1: 查询2: 子查询工作正常,因为我得到的两个记录都只有数字值,但是查询的COUN