【问题标题】:How can reduce the time of query如何减少查询时间
【发布时间】:2013-06-05 22:08:36
【问题描述】:

我有一个名为 ResultValues 的表,其中有 6 列,4 列是整数,1 是数据时间,1 是 varbinary (1640)。

总记录数为“27,389,918”,因此该表非常庞大。现在当我运行这个查询时

select LineNo ,TraceNo, DateTime ,Bin from ResultValues
where ID = 8115
Order by DateTime ASC

我在 UniqueID、ID、LineNo、TraceNo 上创建了非聚集索引,它给了我 987014。

问题:我在非聚集索引之前所用的时间仍然相同。有人可以告诉我如何减少使用此查询的时间。请建议。

【问题讨论】:

  • ID是唯一值吗?
  • 查询计划说什么?很可能它没有使用索引。尝试先创建一个带有 ID 的索引。
  • 不,不是。它们都不是独一无二的。唯一 ID 也不是唯一 ID。
  • 什么是 987014?行数或查询持续时间?如果是行数,则将数据从服务器传输到应用程序需要一段时间
  • 你真的希望结果按日期时间排序。结果需要对 987014 个项目进行排序。您可以通过在 ID 上创建聚集索引以某种方式更快地过滤数据。但仍然需要时间。

标签: sql sql-server-2008 optimization query-optimization


【解决方案1】:
CREATE NONCLUSTERED INDEX ix_id_DateTime__LineNo_TraceNo_Bin 
ON (ID, DateTime)  INCLUDE (LineNo ,TraceNo, Bin)

这应该是特定查询的覆盖索引 - 它应该会给你最好的结果。

【讨论】:

    【解决方案2】:

    id, other columns 上创建索引不是一个好主意。

    id 上创建一个索引只是。您应该会发现查询时间要好得多。

    原因有两个:

    • id 是唯一的,因此向索引添加更多列不会创建更多索引条目,因此不会产生任何性能或效率
    • 索引条目会小很多,因此可以更快地扫描索引,从而缩短查询时间

    这种索引“有用”的唯一情况是用于仅索引查询,其中所有数据都可以从索引中检索,而无需转到表。但是,这是一种非常具体/利基的性能技术,恕我直言,价值不大。我曾与许多生产系统合作过,包括非常大的基于 Web 的公司,但从未见过这样定义的索引。它们对数据库的维护非常昂贵,而且通常弊大于利,而且好处是微乎其微的。

    【讨论】:

    • 在单列上建立索引(几乎)从来都不是一个好主意!
    • 假设 987,014 是行数,这意味着要进行 987,014 次查找以检索丢失的列。很可能该索引不会被使用,即使使用它仍然会很昂贵。 (我知道ID 听起来应该是独一无二的,但他们也提到了一个名为UniqueID 的列)
    • @nenad 相反。在一列上创建索引是常态。许多数据库在定义外键时会隐式执行此操作。
    • 我不知道“许多数据库”,但我可以向您保证,SQL Server 会,而且通常不会 - 忽略这样的索引,因为使用它们比仅仅进行扫描更昂贵。我前段时间写过一些关于它的东西 - stackoverflow.com/questions/15697992/…(虽然这有点简化,但如果需要可以更详细地解释)
    • ps:您假设 ID 是唯一的 - 在这种情况下,是的,它可以使用索引,但是 OP 已经声明它不是唯一的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多