1

我们的 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 的记录。执行计划是执行全表扫描。如何设计表结构和索引以避免表扫描?谢谢!

4

2 回答 2

2

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

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

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

于 2013-03-19T04:36:45.087 回答
1

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

于 2013-03-19T02:20:25.900 回答