有1亿条数据的表,取一条数据的效率问题

时间:2021-06-17 23:29:16
比如说: 有一个表log id 是主键,默认是聚集索引

select  * from log where id = 10000
select top 1  * from log where id = 10000
这两个 那一个速度更快呢?
top 是按照 聚集索引物理顺序开始查找,找到就不再查找了,难道 第一句找到还要继续查找么,sql Server 不能自己优化这中查询?

9 个解决方案

#1


正常来说,第一条快,你可以在同一个界面,ctrl+m,然后一起执行:
select  * from log where id = 10000
select top 1  * from log where id = 10000

看下百分比,高的哪个效率低

#2


top 是按照 聚集索引物理顺序开始查找 
这个说法不准确,如果数据放在几个数据文件中,那么优化器可能会进行并行查找,这时候的顺序就无法保证。另外,如果你要SELECT *,恐怕都是聚集索引扫描了

#3


log id 是主键,默认是聚集索引

select  * from log where id = 10000
那么找到之后,肯定不会再继续了,

不是说了吗,id是主键,具有唯一想,找到一条数据后,肯定没有其他id=10000的了

#4


索引的存储本身是有序存储,来提高查询效率的,
即便是非聚集索引(假如是唯一非聚集索引)
比如,1,2,4,5,6,78,9
那么,找id=5的数据,
找到“第一条”id=5的数据之后,后面的数据肯定比5大,所以不会继续找下去

#5


第二条的计划应该比第一条多个排序,其它一样,效率几乎没差别。

#6


引用 1 楼 DBA_Huangzj 的回复:
正常来说,第一条快,你可以在同一个界面,ctrl+m,然后一起执行:
select  * from log where id = 10000
select top 1  * from log where id = 10000

看下百分比,高的哪个效率低


这是问什么呢?有人说 第二条快呢,但是按你说的步骤去测试确实第一条快。

#7


引用 5 楼 guguda2008 的回复:
第二条的计划应该比第一条多个排序,其它一样,效率几乎没差别。


top 就一定会有排序么? 还是默认会按照 物理顺序?

#8


引用 4 楼 x_wy46 的回复:
索引的存储本身是有序存储,来提高查询效率的,
即便是非聚集索引(假如是唯一非聚集索引)
比如,1,2,4,5,6,78,9
那么,找id=5的数据,
找到“第一条”id=5的数据之后,后面的数据肯定比5大,所以不会继续找下去

唯一值索引是这么个查询优化么?

#9


引用 6 楼 wangzhe_518 的回复:
Quote: 引用 1 楼 DBA_Huangzj 的回复:

正常来说,第一条快,你可以在同一个界面,ctrl+m,然后一起执行:
select  * from log where id = 10000
select top 1  * from log where id = 10000

看下百分比,高的哪个效率低


这是问什么呢?有人说 第二条快呢,但是按你说的步骤去测试确实第一条快。
top的逻辑通常是需要进行排序的,不然怎么知道“数据集”的第一个数据呢?你要分清楚,SELECT出来的是数据集,而不是表本身,查询过程优化器需要先取数据,然后再排序,而不一定就按照索引方式来排序的。

#1


正常来说,第一条快,你可以在同一个界面,ctrl+m,然后一起执行:
select  * from log where id = 10000
select top 1  * from log where id = 10000

看下百分比,高的哪个效率低

#2


top 是按照 聚集索引物理顺序开始查找 
这个说法不准确,如果数据放在几个数据文件中,那么优化器可能会进行并行查找,这时候的顺序就无法保证。另外,如果你要SELECT *,恐怕都是聚集索引扫描了

#3


log id 是主键,默认是聚集索引

select  * from log where id = 10000
那么找到之后,肯定不会再继续了,

不是说了吗,id是主键,具有唯一想,找到一条数据后,肯定没有其他id=10000的了

#4


索引的存储本身是有序存储,来提高查询效率的,
即便是非聚集索引(假如是唯一非聚集索引)
比如,1,2,4,5,6,78,9
那么,找id=5的数据,
找到“第一条”id=5的数据之后,后面的数据肯定比5大,所以不会继续找下去

#5


第二条的计划应该比第一条多个排序,其它一样,效率几乎没差别。

#6


引用 1 楼 DBA_Huangzj 的回复:
正常来说,第一条快,你可以在同一个界面,ctrl+m,然后一起执行:
select  * from log where id = 10000
select top 1  * from log where id = 10000

看下百分比,高的哪个效率低


这是问什么呢?有人说 第二条快呢,但是按你说的步骤去测试确实第一条快。

#7


引用 5 楼 guguda2008 的回复:
第二条的计划应该比第一条多个排序,其它一样,效率几乎没差别。


top 就一定会有排序么? 还是默认会按照 物理顺序?

#8


引用 4 楼 x_wy46 的回复:
索引的存储本身是有序存储,来提高查询效率的,
即便是非聚集索引(假如是唯一非聚集索引)
比如,1,2,4,5,6,78,9
那么,找id=5的数据,
找到“第一条”id=5的数据之后,后面的数据肯定比5大,所以不会继续找下去

唯一值索引是这么个查询优化么?

#9


引用 6 楼 wangzhe_518 的回复:
Quote: 引用 1 楼 DBA_Huangzj 的回复:

正常来说,第一条快,你可以在同一个界面,ctrl+m,然后一起执行:
select  * from log where id = 10000
select top 1  * from log where id = 10000

看下百分比,高的哪个效率低


这是问什么呢?有人说 第二条快呢,但是按你说的步骤去测试确实第一条快。
top的逻辑通常是需要进行排序的,不然怎么知道“数据集”的第一个数据呢?你要分清楚,SELECT出来的是数据集,而不是表本身,查询过程优化器需要先取数据,然后再排序,而不一定就按照索引方式来排序的。