在oracle中select*vs select colname的性能

Vic*_*tor 3 sql oracle

为什么表现select * from table不如select col_1,col_2 from table?据我所知,这是占用时间的行的定位,而不是返回多少列.

Jus*_*ave 10

选择不必要的列可能会导致对性能产生巨大影响的查询计划更改.例如,如果有索引,col_1, col2但表中有其他列,则select *查询必须执行全表扫描,而select col_1, col_2查询可以简单地扫描可能更小的索引,因此,成本更低查询.如果您开始处理涉及多个表的查询或涉及对视图的查询,那么选择列的子集有时也可以通过允许Oracle消除不必要的连接或函数评估来更改查询计划.现在,公平地说,查询计划将根据选择的列进行更改并不是特别常见,但是当它发生时,更改通常很重要.

如果要从数据库外部的应用程序发出SQL语句,则选择其他列会强制Oracle通过网络发送其他数据,这样您的应用程序将花费更多时间等待网络I/O发送它不感兴趣的数据.如果您的应用程序部署在WAN上,那么效率可能非常低.

选择不必要的列也可以强制Oracle在不更改计划的情况下执行其他I/O. 例如,如果表中不需要的列之一是LOBOracle,则Oracle必须执行其他工作来获取该LOB数据.如果数据存储在磁盘上的链接块中,但您感兴趣的列恰好位于第一行中,则Oracle不必为指定列子集的查询获取其他行块.select *另一方面,执行a的查询必须获取每个行块.

当然,那是在考虑维护方面之前.如果您正在编写PL/SQL之外的应用程序,那么SELECT *表示当某人将来向表中添加新列时您的代码将中断,或者您的应用程序必须在运行时动态确定正在的列集返回以自动容纳新列.虽然这当然是可能的,但它可能会导致代码更复杂,因此更难以调试和维护.如果您正在编写PL/SQL并将数据提取到%ROWTYPE变量中,那么SELECT *在生产代码中进行操作是完全合理的.在其他语言中,如果你这样做,你通常会为维护噩梦做好准备SELECT *.