范围搜索的SQL Server表和索引设计

时间:2013-03-19 01:25:21

标签: sql sql-server indexing query-optimization

我们的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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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