如果我有这样的查询:
[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决定对此查询使用聚簇索引扫描。为什么?在这种情况下,为什么首选聚集索引扫描而不是表扫描?
答案 0 :(得分:0)
如果我在某些列上添加聚簇索引,则QO决定对此查询使用聚簇索引扫描
因为当你在表上创建聚簇索引时,表中的数据会按索引顺序重新排列。所以表自身是聚簇索引。这也是你不能在同一个表上有两个聚簇索引的原因< / p>
总而言之,当您创建聚簇索引时,只有一个结构,而不是两个(聚簇索引和表)
答案 1 :(得分:0)
查询是&#34;给我所有行和所有列&#34;这意味着&#34;读取每一行&#34;这是扫描
索引搜索无关,因为没有WHERE子句。 不像这样:
SELECT * FROM tTable WHERE PrimaryClusteredKeyValue = 45
然后,这可能会使用非聚簇搜索,然后是聚簇键查找,或者它仍然可以扫描聚簇索引,因为您要求所有列。这取决于gbn
匹配的行数
SELECT * FROM tTable WHERE NonClusteredOtherColumnValue = 'gbn'