使用 DateTime WHERE 子句对大型表进行查询



我正在尝试使用 WHERE 子句中的日期时间列从一个相当大的表(大约 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

在 SQL Server 中:

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

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

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

或修改现有索引以包含Value1

此外,请检查执行计划。如果仍有性能问题,请使用粘贴计划 @ 共享执行计划 @ brentozar.com 以下是说明:如何使用粘贴计划。

您的位置中只有 DateTime1,因此请仅为此列创建索引。复杂索引就像将字符串的所有部分(如日期时间 1+日期时间2+ID+值 2(放在一起。哦,是的,那一定很慢。

最新更新