首页新闻找找看学习计划

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

0
悬赏园豆:10 [已解决问题] 解决于 2014-03-11 16:54

SQLSERVER 中,有个语句用SELECT * 只要1S,

用SELECT [字段1],[字段2]...却要30几秒,

这是什么问题了?

水无声的主页 水无声 | 初学一级 | 园豆:92
提问于:2014-03-10 10:14
< >
分享
最佳答案
2

这个要看具体的执行计划。首先我们要分析清楚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 *反而快。

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

收获园豆:10
ocean | 小虾三级 |园豆:824 | 2014-03-10 11:18

应该正解。

素笔描青眉 | 园豆:200 (初学一级) | 2014-03-10 12:29

数据最小单位是页 (也就是你所说的块)大小8K左右  另外聚集索引扫描与表扫描在IO开销与执行时间上差距非常小 可以忽略不计,索引查找与表扫描差距才是最大的,索引查找只需要选择性的找描部分数据页。

另外聚集索引数据直接存在叶子节点,而非聚集索引只是存指向数据的指针。你说的第二种情况属于书签查找,原理正如你所说!

到底是select * 快还是select a1,a2 与索引确实有系,生成的执行计划不同执行时间也会不同,当然返回所有列与返回选定列 抛开索引的影响,肯定是列越少IO的开销就越小速度也就越快

Zery | 园豆:6066 (大侠五级) | 2014-03-10 18:18

@Zery: 没错,我说的索引其实都是特指的非聚集索引。

ocean | 园豆:824 (小虾三级) | 2014-03-14 14:55
其他回答(7)
0

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

dudu | 园豆:41066 (高人七级) | 2014-03-10 10:50
0

我不信  截图上来!!!

许你一世幸福 | 园豆:82 (初学一级) | 2014-03-10 11:02

我也不太信

支持(0) 反对(0) 沧海一杰 | 园豆:28 (初学一级) | 2014-03-10 11:48

是的,截图上来!

支持(0) 反对(0) +小马哥++ | 园豆:906 (小虾三级) | 2014-03-10 16:35
0

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

Zery | 园豆:6066 (大侠五级) | 2014-03-10 11:03
0

说比【】【】【】低的,我真不知道他们的说法哪里来得

月明时勤 | 园豆:746 (小虾三级) | 2014-03-10 11:06
0

关注哈子,看慢在何处。

水晶途途 | 园豆:1434 (小虾三级) | 2014-03-10 12:15
0

不科学

✎﹏ℳ๓₯㎕ღ | 园豆:1497 (小虾三级) | 2014-03-10 13:13
0

不科学

Rookier | 园豆:647 (小虾三级) | 2014-03-10 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册