我有一个有两个索引的表;一个是多列聚集索引,在 3 列上:
(
symbolid int16,
bartime int32,
typeid int8
)
第二个是非聚集在
(
bartime int16
)
我试图运行的选择语句是:
SELECT symbolID, vTrdBuy
FROM mvTrdHidUhd
WHERE typeID = 1
AND barDateTime = 44991
AND symbolid in (1010,1020,1030,1040,1050,1060)
我使用 sql management studio 编辑器在 sql2008 上运行此查询并启用实际执行计划,我发现 sql 使用第二个索引和 propse 为三列(symbolid、bartime、typeid)创建一个新索引但非聚集!!!(我认为它说的是非聚集索引,因为已经有一个聚集索引)
这个选择是错误的,我再次重新运行相同的查询并强制 SQL 使用聚集索引(使用“with index”)并且性能应该更好。
我在这里有两个问题,一个与此行为有关,第二个与查询本身有关
- 为什么 SQL 选择错误的索引并支持相同的索引
- 在这种情况下我应该使用哪一个以
"where"
获得更好的性能
符号在 (1010,1020,1030,1040,1050,1060)
(符号 = 1010 或符号 = 1020 ..等)
(符号介于 (1010 和 1060) 之间)
测试后
我发现当我将 where 条件从使用 IN 更改为使用 >= 和 <= bartime 列上的非聚集索引比 3 列上的聚集索引提供更好的性能。
所以我有两种情况,如果 WHERE 使用 IN 最好使用聚集索引,如果它包含 >= 和 <= 它使用第二个。