我有一个500万行表,最常被特定查询命中。所以我想添加一个索引来加快速度。
查询:
SELECT someID
FROM someTable
WHERE
myVarChar = @myVarChar AND
MyBit = 0 AND
MyBit2 = 1 AND
MyBit3 = 0
注意,myVarChar
列是唯一的。
此类查询的最佳索引是什么?我目前有一个索引,涵盖了上述查询中的所有4列。另外,我是否经常重新索引或自动重新索引?
我使用的是sql server 2008标准。
答案 0 :(得分:6)
someID是该表的主键吗?如果没有,您应该将其添加到索引中以防止书签查找。
另外,查看该查询的执行计划,如果索引构造正确,您应该在执行计划视图中看到两个图标:SELECT和Index Seek。
答案 1 :(得分:2)
如果你有一个带有四列的覆盖索引,它可能是最好的。您应该定期重新索引和更新统计信息,但至少每周一次。
答案 2 :(得分:0)
这可能是您查询的最佳索引,但在创建它之后,请检查执行计划以确保它正在被使用。如果在查询分析器中运行原始SQL时获得两个不同的执行计划,并且当您将其作为存储过程运行时,请阅读parameter sniffing。
create unique index IX_MyIndex on SomeTable (myVarChar, MyBit, MyBit2, MyBit3) include (SomeID)
检查您的执行计划,确保您在没有密钥查找的情况下获得索引查找。如果确实看到了键查找,则可能需要更改或添加列到索引或include()部分。此外,如果您要进行任何排序 - 尤其是desc
,请务必将其添加到索引中。
答案 3 :(得分:0)
首先,您需要使用此类查询来获取列的分区,观察您获得的值,并通过区分对列进行排序。
SELECT myVarChar ,count(*)
FROM someTable
GROUP BY myVarChar
ORDER BY 2 desc
其次,您可以在此对话框中使用create index:
CREATE UNIQUE INDEX IX_MyIndex
ON SomeTable (myVarChar, MyBit, MyBit2, MyBit3)
INCLUDE (SomeID)
什么codemonkey说的是对的,请避免为boolean类值构建非聚集索引。但您可以尝试使用(其他类型值+布尔值)
构建索引