为了账号安全,请及时绑定邮箱和手机立即绑定

SELECT * 速度比 SELECT [字段1],[字段2]... 还快

SELECT * 速度比 SELECT [字段1],[字段2]... 还快

www说 2018-07-27 09:09:24
SQLSERVER 中,有个语句用SELECT * 只要1S,用SELECT [字段1],[字段2]...却要30几秒,这是什么问题了?
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

这个要看具体的执行计划。首先我们要分析清楚select *和select a1,a2,a3的区别。

首先sql server是按照数据块来存取数据的,一个数据块是8K,当你需要的数据在某个数据块上时,sql server会将整个8K的数据从磁盘上加载到内存中,而不仅仅是读取你需要的a1、a2这几个字段,从这种意义上来说,select *和select a1,a2,a3这种写法速度是一样的。

但是有一个问题在于有索引,当有索引的时候就不一样了,比如a1, a2, a3都在索引字段里面(包括inclue),这个时候如果select a1, a2,a3的话只要扫描索引就好了,而select *却要扫描表,通常这种情况下select a1, a2, a3要快一些。但是如果只有a1, a2在索引中,而a3不在索引中,那么select a1, a2, a3的时候就需要先扫描索引得到a1, a2,再通过索引找到表中对应的数据块取出来a3(注意取a3的时候是8K数据块一起取得),这时你会发现select a1, a2, a3又没什么优势了。当取得数据特别多的时候,扫描索引再去查找表,反而不如直接扫描表来的快,所以有时可能select *反而快。

所以要具体问题具体分析,具体的要看查询计划,确定问题所在。


查看完整回答
反对 回复 2018-08-01
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

怎么会有如此神奇之事,把两者执行计划贴出来对比下

查看完整回答
反对 回复 2018-08-01
?
呼如林

TA贡献1798条经验 获得超3个赞

建议比较一下两者的执行计划

查看完整回答
反对 回复 2018-08-01
  • 3 回答
  • 0 关注
  • 991 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信