如何避免 SQL Server 2005 中的索引扫描?

4 performance sql-server-2005 sql-server

我有一个名为的表Cell,其中包含诸如Cell_ID,CellValue和 之类的列CellRow

Cellrow最多可以有 1 到 5 的值。Cell_ID 字段上有一个聚集索引。该表包含 100000 行。

在我的查询中,我必须使用CellRowWHERE 子句中的列CellRow > 3来获取CellValue字段中的数据。问题是当我这样做时,总是表扫描使我的查询非常慢。

我还通过在CellRow字段上放置非聚集索引来检查它,但仍然进行索引扫描,因为该CellRow字段没有太多值,每次只有 1 到 5 个值。我不能CellID在 where 子句中使用。

我在查询中使用了许多表,例如

Table_1与接合table_2通过使用聚簇索引列和table 2与接合table_3通过使用非聚集的索引列,并table_3与被接合Cell通过使用非聚集的索引表。

最后的故事是,我从包括单元格表在内的所有表中得到不同的值,但是当我CellRow在 WHERE 子句中使用字段时,我得到了索引扫描。

任何解决方案:)

非常感谢!

mar*_*c_s 11

任何解决方案:)

不,不是真的。

正如您自己所说 -CellRow只是不是很有选择性 - 5 个可能的值,100'000 行 = 每个可能值大约 20'000 行。

SQL Server 的查询优化器认识到了这一点,并且可能认为进行索引扫描比搜索 20'000 行更容易、更有效。

避免这种情况的唯一方法是使用更具选择性的索引,即选择 2%、3% 或最大值的某些其他列。每个查询 5% 的行。

PS:检查你的执行计划——它是直接从索引中获取值,还是需要一个“键查找”步骤来获取数据??

您没有提到您的列是什么数据类型 - 如果CellValue不是太大,您可以将其添加到索引中(或至少将其包含在索引中)以避免昂贵的键查找:

CREATE INDEX IX_CellRow_CellValues
ON dbo.Cell(CellRow) INCLUDE(CellValue)
Run Code Online (Sandbox Code Playgroud)

不过,您仍然可以进行索引扫描