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)
不过,您仍然可以进行索引扫描