索引和count(*)的关系,高手请进

时间:2022-06-22 14:37:43
sql:select count(*) from t


问题:
1,当表t上只有 一个聚集索引表t上没有索引,这两种情况下,这句sql有何区别?
2,当表t上只有 一个非聚集索引表t上没有索引,这两种情况下,这句sql有何区别?

15 个解决方案

#1


都一个样,计划会找索引列去计数的。

#2


引用 1 楼 htl258 的回复:
都一个样,计划会找索引列去计数的。

1,当表t上只有一个聚集索引 表t上 没有索引,这 两种情况下,这句sql有何区别?
2,当表t上只有一个非聚集索引 表t上 没有索引,这 两种情况下,这句sql有何区别?

#3


count(*) 统计行数 应该与索引没有关系

#4


问题:
1,1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
是这意思:
情况a:当表t上只有一个聚集索引,
情况b:表t上没有索引
这两种情况下,这句sql有何区别?

2,当表t上只有一个 聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
是这意思:
情况a:当表t上只有一 个聚集索引,
情况b:表t上没有索引
这两种情况下,这句sql有何区别?

#5


1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上

#6


引用 5 楼 htl258 的回复:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上

那就是说有索引还是会快一些?

#7


引用 6 楼 zhangsong841 的回复:
引用 5 楼 htl258 的回复:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上

那就是说有索引还是会快一些?
这是肯定的。

#8


当然,主要针对数据量大,数据量大才表现明显,数据量少可能有没有索引都一样。

#9


问题:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?

1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,

2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
也会进行非聚集索引扫描索引页,流聚合,标量计算,再输出,
没索引是堆,扫描数据页,如果数据量大一点,有非聚集索引的表比没索引的应该要好,
非聚集索引页比数据页要少

#10


引用 9 楼 sql77 的回复:
问题:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?

1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,

首先谢谢sql77,
1、我的意思是 有表t聚集索引表t上没有任何索引的区别?

2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里 没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者 聚集索引列 返回结果占整张表的 比例很大的话,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?

#11


引用 10 楼 zhangsong841 的回复:
2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者有聚集索引列但返回结果占整张表的比例很大的话

我的意思:
表T( ID INT
      NAME VARHCAR(10))
create clustered index idx on t(id)
a:where 中 没有id的限制条件,
b:where 中 id的限制条件, 返回结果占整张表的 比例很大
这a、b两中情况下,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?

#12


引用 11 楼 zhangsong841 的回复:
引用 10 楼 zhangsong841 的回复:

2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者有聚集索引列但返回结果占整张表的比例很大的话

我的意思:
表T( ID INT
  NAME VARHCAR(10))
create clustered index idx on t(id……

1、我的意思是有表t聚集索引和表t上没有任何索引的区别?

有聚集索引其实还要占一个唯一标识,数据量大,读取的数据页可能还会多一点,而堆会少一点

a:where 中没有id的限制条件,
b:where 中有id的限制条件,但返回结果占整张表的比例很大
在这a、b两中情况下,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?

没有限制条件上面已经说了,无序聚集索引扫描,
有条件,如果返回结果集很大,虽然是聚集索引查找+有序局部扫描也相当于扫描了整个聚集索引页,
效率差不多都一样,这个得看你的具体情况,

#13


select count(*) from tab 
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
语句都会通过“表扫描”统计行数。

2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
如果有非聚集索引,语句会通过“非聚集索引”统计行数。

这是因为 SQL Server 会根据执行计划所需要的 i/o 次数来决定使用 index scan,还是 table scan。
显然,通过聚集索引的 index scan 会比 tablescan 需要更多的 i/o,因为聚集索引是 b-tree 结构,有中间节点。
而非聚集索引的叶级索引页不保存实际的表行,因此占用的索引页要比整个表的数据页面要少得多,通过其进行行数统计所需的 i/o 也要少。

#14


引用 13 楼 xman_78tom 的回复:
select count(*) from tab 
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
语句都会通过“表扫描”统计行数。

2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
如果有非聚集索引,语句会通过“非聚集索引”统计行数。

这是因为 SQL Server 会根据执行计划所需要的 i/o 次数来决定使……

up,学习

#15


多谢楼上的高手,尤其感谢HTL258、SQL77、TOM。

#1


都一个样,计划会找索引列去计数的。

#2


引用 1 楼 htl258 的回复:
都一个样,计划会找索引列去计数的。

1,当表t上只有一个聚集索引 表t上 没有索引,这 两种情况下,这句sql有何区别?
2,当表t上只有一个非聚集索引 表t上 没有索引,这 两种情况下,这句sql有何区别?

#3


count(*) 统计行数 应该与索引没有关系

#4


问题:
1,1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
是这意思:
情况a:当表t上只有一个聚集索引,
情况b:表t上没有索引
这两种情况下,这句sql有何区别?

2,当表t上只有一个 聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
是这意思:
情况a:当表t上只有一 个聚集索引,
情况b:表t上没有索引
这两种情况下,这句sql有何区别?

#5


1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上

#6


引用 5 楼 htl258 的回复:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上

那就是说有索引还是会快一些?

#7


引用 6 楼 zhangsong841 的回复:
引用 5 楼 htl258 的回复:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上

那就是说有索引还是会快一些?
这是肯定的。

#8


当然,主要针对数据量大,数据量大才表现明显,数据量少可能有没有索引都一样。

#9


问题:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?

1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,

2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
也会进行非聚集索引扫描索引页,流聚合,标量计算,再输出,
没索引是堆,扫描数据页,如果数据量大一点,有非聚集索引的表比没索引的应该要好,
非聚集索引页比数据页要少

#10


引用 9 楼 sql77 的回复:
问题:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?

1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,

首先谢谢sql77,
1、我的意思是 有表t聚集索引表t上没有任何索引的区别?

2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里 没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者 聚集索引列 返回结果占整张表的 比例很大的话,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?

#11


引用 10 楼 zhangsong841 的回复:
2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者有聚集索引列但返回结果占整张表的比例很大的话

我的意思:
表T( ID INT
      NAME VARHCAR(10))
create clustered index idx on t(id)
a:where 中 没有id的限制条件,
b:where 中 id的限制条件, 返回结果占整张表的 比例很大
这a、b两中情况下,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?

#12


引用 11 楼 zhangsong841 的回复:
引用 10 楼 zhangsong841 的回复:

2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者有聚集索引列但返回结果占整张表的比例很大的话

我的意思:
表T( ID INT
  NAME VARHCAR(10))
create clustered index idx on t(id……

1、我的意思是有表t聚集索引和表t上没有任何索引的区别?

有聚集索引其实还要占一个唯一标识,数据量大,读取的数据页可能还会多一点,而堆会少一点

a:where 中没有id的限制条件,
b:where 中有id的限制条件,但返回结果占整张表的比例很大
在这a、b两中情况下,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?

没有限制条件上面已经说了,无序聚集索引扫描,
有条件,如果返回结果集很大,虽然是聚集索引查找+有序局部扫描也相当于扫描了整个聚集索引页,
效率差不多都一样,这个得看你的具体情况,

#13


select count(*) from tab 
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
语句都会通过“表扫描”统计行数。

2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
如果有非聚集索引,语句会通过“非聚集索引”统计行数。

这是因为 SQL Server 会根据执行计划所需要的 i/o 次数来决定使用 index scan,还是 table scan。
显然,通过聚集索引的 index scan 会比 tablescan 需要更多的 i/o,因为聚集索引是 b-tree 结构,有中间节点。
而非聚集索引的叶级索引页不保存实际的表行,因此占用的索引页要比整个表的数据页面要少得多,通过其进行行数统计所需的 i/o 也要少。

#14


引用 13 楼 xman_78tom 的回复:
select count(*) from tab 
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
语句都会通过“表扫描”统计行数。

2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
如果有非聚集索引,语句会通过“非聚集索引”统计行数。

这是因为 SQL Server 会根据执行计划所需要的 i/o 次数来决定使……

up,学习

#15


多谢楼上的高手,尤其感谢HTL258、SQL77、TOM。