在我的表上为此查询添加索引

时间:2009-01-28 16:20:57

标签: sql-server performance sql-server-2008 indexing

我有一个500万行表,最常被特定查询命中。所以我想添加一个索引来加快速度。

查询:

SELECT someID 
FROM   someTable 
WHERE 
       myVarChar = @myVarChar AND
       MyBit = 0 AND 
       MyBit2 = 1 AND 
       MyBit3 = 0

注意,myVarChar列是唯一的。

此类查询的最佳索引是什么?我目前有一个索引,涵盖了上述查询中的所有4列。另外,我是否经常重新索引或自动重新索引?

我使用的是sql server 2008标准。

4 个答案:

答案 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类值构建非聚集索引。但您可以尝试使用(其他类型值+布尔值)

构建索引