为什么 QO 选择聚簇索引扫描与表扫描?



如果我有这样的查询:

SELECT * FROM tTable

如果tTable不包含任何索引,则按预期进行表扫描。如果我在某个列上添加聚集索引,则 QO 决定对此查询使用聚集索引扫描。为什么?为什么在这种情况下首选聚集索引扫描而不是表扫描?

如果我在某个列上添加聚集索引,则 QO 决定对此查询使用聚集索引扫描

因为当您在表上创建聚簇索引时,表中的数据会按索引顺序重新排列。所以表本身是聚簇索引。这也是为什么不能在同一表上有两个聚集索引的原因

总而言之,当您创建聚簇索引时,只有一个结构,而不是两个(聚簇索引和表(

查询是"给我所有行和所有列",这意味着"读取每一行",这是一个扫描

没有什么可以执行索引查找,因为没有 WHERE 子句。 与此不同:

SELECT * FROM tTable WHERE PrimaryClusteredKeyValue = 45

然后,这可能使用非聚集查找,然后是聚集键查找,或者它可能仍会扫描聚集索引,因为您请求所有列。这取决于gbn将匹配多少行

SELECT * FROM tTable WHERE NonClusteredOtherColumnValue = 'gbn'

最新更新