使用DateTime WHERE子句查询大型表

时间:2017-05-15 12:27:03

标签: sql sql-server tsql large-data

我尝试使用WHERE子句中的datetime列来查询来自相当大的表(大约9800万行)的数据。大约需要12分钟才能完成 - 这显然是不可接受的。查询很简单:

SELECT ID, DateTime1, DateTime2, Value1, Value2
FROM dataTable
WHERE DateTime1 >= '2017-05-15 09:00' AND
      DateTime1 <= '2017-05-15 09:30'

该表具有以下结构:

Column Name | DataType
-------------------------
ID          | float
DateTime1   | datetime
DateTime2   | datetime
Value1      | float
Value2      | varchar(20)

该表具有以下索引:

Nonclustered: DateTime1, DateTime2, ID, Value2

2 个答案:

答案 0 :(得分:1)

在SQL Server中:

您的索引不包含Value1,因此如果使用现有索引,则必须从表中检索该列。

您可以创建覆盖索引(包括查询所需的所有列),如下所示:

create nonclustered index ix_dataTable_DateTime1_cover 
  on dbo.dataTable (DateTime1)
    include (Id, DateTime2, Value1, Value2);

或修改现有索引以包含Value1

另外,检查执行计划。如果仍然存在性能问题,请使用Paste The Plan @ brentozar.com分享您的执行计划,以下是说明:How to Use Paste the Plan

答案 1 :(得分:0)

您的位置只有DateTime1,因此仅为此列创建索引。 复杂的索引就像将字符串放在一起,就像你的DateTime1 + DateTime2 + ID + Value2一样。哦,是的,那一定很慢。