use*_*301 1 sql sql-server-2008
我发现如果查询小于或大于运算符的表,则sql server索引不能正常工作。
假设我有一个仅包含2列的简单表(TestTable),如下所示:
Column Name, column type, primary Key, index
iID, int, yes, cluster index
iCount, int, no, non-cluster index
name, nvarchar(255), no, no index
Run Code Online (Sandbox Code Playgroud)
现在,我以此查询表:
SELECT * FROM TestTable,其中iCount = 10。
很好,Sql服务器将对列iCount使用非群集索引来检索结果。
但是,如果我以此查询表:
SELECT * FROM TestTable,其中iCount <10,
SQL Server将对群集索引进行索引扫描以获取iID以检索结果。
我想知道为什么当我在查询中使用小于或大于运算符时,sql server无法使用正确的索引。
如果表中的行很少,则SQL Server扫描聚簇索引比使用非聚簇索引然后查找聚簇索引中的其余列要便宜得多。如果是这种情况,请将查询更改为SELECT iCount FROM ...,您应该会看到查询计划已更改为按预期使用索引。