【发布时间】:2010-10-26 23:18:39
【问题描述】:
我有一个有两个索引的表;一个是多列聚集索引,在 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)
我在 sql2008 上使用 sql management studio 编辑器运行此查询并启用实际执行计划,我发现 sql 使用第二个索引和 propse 为三列(symbolid、bartime、typeid)创建了一个新索引但非聚集! !! (我认为它说的是非聚集索引,因为已经有一个聚集索引)
这个选择是错误的,我再次重新运行相同的查询并强制 SQL 使用聚集索引(使用“with index”)并且性能更好。
我在这里有两个问题,一个与此行为有关,第二个与查询本身有关
- 为什么SQL选择了错误的索引并提出了相同的索引
- 我应该在
"where"条件下使用哪一个以获得更好的性能
符号在 (1010,1020,1030,1040,1050,1060)
(symbolid = 1010 或 symbolid = 1020 ..etc)
(符号介于 (1010 和 1060) 之间)
测试后
我发现当我将 where 条件从使用 IN 更改为使用 >= 和
所以我有两种情况,如果 WHERE 使用 IN,最好使用聚集索引,如果它包含 >= 并且
【问题讨论】:
标签: sql-server tsql sql-server-2008 sql-execution-plan