我们的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的记录。执行计划是执行整个表扫描。如何设计表结构和索引以避免表扫描?谢谢!
答案 0 :(得分:2)
在[Begin]和[End]上创建复合索引,包括[name],然后从查询中删除*,替换为列名
SELECT name, [begin],[end]
FROM T
WHERE 5 BETWEEN [Begin] AND [End]
这样做的原因是,只做一次非集群索引查找,一次I / O读取。 再次检查查询计划,它应该是这样的: 索引搜索(非群集索引....)100%
答案 1 :(得分:1)
添加包含开始日期和结束日期的索引(如果不存在)。