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

时间:2017-07-25 08:16:50

标签: sql-server indexing

如果我有这样的查询:

[a-zA-Z0-9]*

其中if(!username.matches("[a-zA-Z0-9]+")){ Toast.makeText(this, "Username must be alphanumeric", Toast.LENGTH_SHORT).show(); return; } if(username.matches("[a-zA-Z]+")){ // only contains letters Toast.makeText(this, "it should contain numbers", Toast.LENGTH_SHORT).show(); return; } if(username.matches("[0-9]+")){ //only contains numbers Toast.makeText(this, "it should contain letters", Toast.LENGTH_SHORT).show(); return; } 不包含任何索引,正如预期的那样发生表扫描。如果我在某些列上添加聚簇索引,则QO决定对此查询使用聚簇索引扫描。为什么?在这种情况下,为什么首选聚集索引扫描而不是表扫描?

2 个答案:

答案 0 :(得分:0)

  

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

因为当你在表上创建聚簇索引时,表中的数据会按索引顺序重新排列。所以表自身是聚簇索引。这也是你不能在同一个表上有两个聚簇索引的原因< / p>

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

答案 1 :(得分:0)

查询是&#34;给我所有行和所有列&#34;这意味着&#34;读取每一行&#34;这是扫描

索引搜索无关,因为没有WHERE子句。 不像这样:

 SELECT * FROM tTable WHERE PrimaryClusteredKeyValue = 45

然后,这可能会使用非聚簇搜索,然后是聚簇键查找,或者它仍然可以扫描聚簇索引,因为您要求所有列。这取决于gbn匹配的行数

 SELECT * FROM tTable WHERE NonClusteredOtherColumnValue = 'gbn'