【问题标题】:Query on large table using DateTime WHERE clause使用 DateTime WHERE 子句查询大表
【发布时间】:2017-10-14 05:48:23
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。您还应该将Value1 放入索引中。

标签: sql sql-server tsql large-data


【解决方案1】:

您的位置中只有 DateTime1,因此仅为该列创建索引。 一个复杂的索引就像将一个字符串从它的所有部分(如 DateTime1+DateTime2+ID+Value2)放在一起。哦,是的,那一定很慢。

【讨论】:

    【解决方案2】:

    在 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

    【讨论】:

    • 谢谢,我会尝试更改索引/添加一个新索引,我会尽快回复您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多