【发布时间】: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 >= '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 >= '2013-09-02 17:46:03.570'的行数和估计匹配mv_fecha >= '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 >= '2013-09-02 17:46:03.571' AND mv.mv_fecha <= '2013-09-04 23:59:59.999')并启用“实际执行计划”选项并将鼠标悬停在计划中的箭头上以查看估计行数和实际行数。
标签: sql-server datetime sql-server-2012 date-comparison