【问题标题】:Query in sql server 2012 with datetime between takes too long with millisecond difference在 sql server 2012 中查询日期时间之间的时间过长,毫秒差
【发布时间】:2013-09-09 18:15:42
【问题描述】:

我对 sql server 2012 中的数据库和查询有一个奇怪的问题。

在记录中,有一列类型为 datetime(不是 datetime2),并以 'YYYY-MM-dd HH:mm:ss.ttt' 格式存储值,但我有一个问题...如果我进行以下查询:

SELECT *
FROM table1 cg 
INNER JOIN table2 mv ON cg.mv_id = mv.mv_id 
FULL JOIN table3 fu ON cg.fu_id = fu.fu_id 
FULL JOIN table4 cl ON cg.cl_id = cl.cl_id 
INNER JOIN table5 so ON mv.so_id = so.so_id 
WHERE  mv.su_id = 1 AND (mv.mv_fecha >= '2013-09-02 17:46:03.571' AND mv.mv_fecha <= '2013-09-04 23:59:59.999')

然后大约需要 10 秒,但如果我将 mv.mv_fecha &gt;= '2013-09-02 17:46:03.571' 更改为 '2013-09-02 17:46:03.572'(注意我将毫秒 571 更改为 572),那么查询需要大约 4 分钟!而且我只有这条记录..如果我进行任何超过那毫秒的查询,查询就会花费很长时间。 我必须指定在 table2 中随便有一条记录,其 mv_fecha'2013-09-02 17:46:03.573' 但即使有该日期时间的记录,查询也不会检索它,因为这是一条 su_id = 2 的记录(在查询中过滤的 su_id 为 1)。

怎么了???

更新:我对 table1.. 有一些理论,就是 table1 有数千条记录,而且它是一个不包含任何索引的表? ..可能是这个问题吗?

UPDATE 2:这是查询的执行计划:

【问题讨论】:

  • 可能统计数据需要更新。估计匹配mv_fecha &gt;= '2013-09-02 17:46:03.570' 的行数和估计匹配mv_fecha &gt;= '2013-09-02 17:46:03.573' 的行数是多少?
  • 同样使用FULL JOIN 是没有意义的。您的 WHERE 子句将其转换回内部连接。
  • 你能告诉我在哪里可以找到这些号码吗?
  • 在 SSMS 中运行 SELECT COUNT(*) FROM YourTable mv WHERE mv.su_id = 1 AND (mv.mv_fecha &gt;= '2013-09-02 17:46:03.571' AND mv.mv_fecha &lt;= '2013-09-04 23:59:59.999') 并启用“实际执行计划”选项并将鼠标悬停在计划中的箭头上以查看估计行数和实际行数。

标签: sql-server datetime sql-server-2012 date-comparison


【解决方案1】:

请试试这个查询 -

SELECT *
FROM Table1 cg
JOIN table2 mv ON cg.mv_id = mv.mv_id
FULL JOIN table3 fu ON cg.fu_id = fu.fu_id
FULL JOIN table4 cl ON cg.cl_id = cl.cl_id
JOIN table5 so ON mv.so_id = so.so_id
WHERE mv.su_id = 1
    AND CAST(mv.mv_fecha AS DATETIME2) BETWEEN '20130902 17:46:03.572' AND '20130904 23:59:59.999')

【讨论】:

  • 现在该查询从 574 毫秒开始花费太长时间:/
  • 请提供此查询的执行计划,DDL 用于您的表和用于测试的小数据集。
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多