问题:
1,当表t上只有 一个聚集索引和 表t上没有索引,这两种情况下,这句sql有何区别?
2,当表t上只有 一个非聚集索引和 表t上没有索引,这两种情况下,这句sql有何区别?
15 个解决方案
#1
都一个样,计划会找索引列去计数的。
#2
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有何区别?
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有何区别?
--同上
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上
#6
那就是说有索引还是会快一些?
#7
这是肯定的。
#8
当然,主要针对数据量大,数据量大才表现明显,数据量少可能有没有索引都一样。
#9
问题:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
也会进行非聚集索引扫描索引页,流聚合,标量计算,再输出,
没索引是堆,扫描数据页,如果数据量大一点,有非聚集索引的表比没索引的应该要好,
非聚集索引页比数据页要少
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
也会进行非聚集索引扫描索引页,流聚合,标量计算,再输出,
没索引是堆,扫描数据页,如果数据量大一点,有非聚集索引的表比没索引的应该要好,
非聚集索引页比数据页要少
#10
首先谢谢sql77,
1、我的意思是 有表t聚集索引和 表t上没有任何索引的区别?
2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里 没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者 有聚集索引列 但返回结果占整张表的 比例很大的话,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?
#11
我的意思:
表T( ID INT
NAME VARHCAR(10))
create clustered index idx on t(id)
a:where 中 没有id的限制条件,
b:where 中 有id的限制条件, 但返回结果占整张表的 比例很大
在 这a、b两中情况下,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?
#12
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 也要少。
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
up,学习
#15
多谢楼上的高手,尤其感谢HTL258、SQL77、TOM。
#1
都一个样,计划会找索引列去计数的。
#2
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有何区别?
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有何区别?
--同上
--只有一个聚集索引,SQL根据索引列聚合,没有任何索引,全表扫描一列来聚合
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
--同上
#6
那就是说有索引还是会快一些?
#7
这是肯定的。
#8
当然,主要针对数据量大,数据量大才表现明显,数据量少可能有没有索引都一样。
#9
问题:
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
也会进行非聚集索引扫描索引页,流聚合,标量计算,再输出,
没索引是堆,扫描数据页,如果数据量大一点,有非聚集索引的表比没索引的应该要好,
非聚集索引页比数据页要少
1,当表t上只有一个聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
1一个表肯定只有一个聚集索引,
有聚集索引,是无序聚集索引扫描,也就是通常意义上的表扫描,这两句SQL没啥差别,
2,当表t上只有一个非聚集索引和表t上没有索引,这两种情况下,这句sql有何区别?
也会进行非聚集索引扫描索引页,流聚合,标量计算,再输出,
没索引是堆,扫描数据页,如果数据量大一点,有非聚集索引的表比没索引的应该要好,
非聚集索引页比数据页要少
#10
首先谢谢sql77,
1、我的意思是 有表t聚集索引和 表t上没有任何索引的区别?
2、看了您的帖子后又有疑问了,有聚集索引的表的话,
如果WHERE查询条件里 没有聚集索引列(如聚集索引列>=10或者<...)的话、
或者 有聚集索引列 但返回结果占整张表的 比例很大的话,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?
#11
我的意思:
表T( ID INT
NAME VARHCAR(10))
create clustered index idx on t(id)
a:where 中 没有id的限制条件,
b:where 中 有id的限制条件, 但返回结果占整张表的 比例很大
在 这a、b两中情况下,
都是‘是无序聚集索引扫描,也就是通常意义上的表扫描’吗?
#12
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 也要少。
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
up,学习
#15
多谢楼上的高手,尤其感谢HTL258、SQL77、TOM。