在oracle中select * vs select colname的性能

时间:2012-08-09 22:47:15

标签: sql oracle

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

2 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:0)

当您执行SELECT *时,存在从表的数据字典中查找定义的问题。

当您需要的唯一列是col_1和col_2时,还存在数据库执行更多工作的问题。这对于大型表来说尤其如此。

存在网络带宽被大于所需数据集不必要地吞噬的问题。

进行SELECT *不是最佳做法。 它还使嵌入式SQL代码更难阅读。