select * 与 性能

select * 对性能的影响;
   
如果select 需要的字段都是被索引的,而且where子句也可从索引获得。那么查询就只需扫描索引即可。因此select *需要关联未被索引的字段,效率就差了。
使用*, 在解析的过程中会将* 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。


如果需要取所有的列,那么SELECT *和SELECT COL1, COL2 *……之间没有性能差别。

但是如果有不需要的列,那么SELECT *就会将更多的数据从服务器传递到客户端,不要小看这些多余的数据传递,它们占用了大量了网络带宽。
如果说IO速度是瓶颈,那么Oracle还提供了缓存,来检查物理IO的数量,而网络传播的可没有办法来减少数据的传送量。
同样是全表扫描的执行计划,百万级的数据量,一个SELECT COUNT(*) FROM TABLE可能在秒级完成,而如果是SELECT * FROM TABLE呢,自己试试在SQLPLUS上执行,看看你需要等待多长时间。当然,这还包括输出时间,那么你可以使用SET AUTOT TRACE,然后看看等待时间。
更何况,SELECT *的情况,一旦表增加了新的字段,那么使用了SELECT *的程序、PL/SQL代码等都要重新修改

posted @ 2013-06-19 15:17  dainichuhai  阅读(1019)  评论(0编辑  收藏  举报