【问题标题】:SQL Server table and index design for range seek用于范围查找的 SQL Server 表和索引设计
【发布时间】:2013-03-19 01:25:21
【问题描述】:

我们的 MS SQL Server 数据库有一个表 T,其中包含以下字段和数据:

Name |  Begin  |  End
-----------------------
A    |    3    |   6
B    |    2    |   4
C    |    4    |   5
...................

我通常使用如下查询:

SELECT *
FROM T
WHERE 5 BETWEEN Begin AND End

查找在“开始”和“结束”字段之间包含常量 5 的记录。执行计划是执行全表扫描。如何设计表结构和索引以避免表扫描?谢谢!

【问题讨论】:

  • 是否有包含开始和结束日期的索引?
  • 没错。谢谢!

标签: sql sql-server indexing query-optimization


【解决方案1】:

在 [Begin] 和 [End] 上创建复合索引,包括 [name],然后从查询中删除 *,替换为列名

 SELECT name, [begin],[end]
FROM T
WHERE 5 BETWEEN [Begin] AND [End]

这样做的原因是,只进行一次非集群索引查找,一次 I/O 读取。 再次查看查询计划,应该是这样的: Index Seek(非集群索引....)100%

【讨论】:

    【解决方案2】:

    如果不存在,则添加包含开始日期和结束日期的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多