sql - oracle 中 select * 与 select colname 的性能对比

标签 sql oracle

为什么select * from table的性能不如select col_1,col_2 from table?据我了解,占用时间的是行的定位,而不是返回多少列。

最佳答案

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

如果您从数据库外部的应用程序发出 SQL 语句,选择附加列会强制 Oracle 通过网络发送附加数据,这样您的应用程序将花费更多时间等待网络 I/O 发送不属于它的数据。感兴趣。这可能非常低效,特别是如果您的应用程序部署在 WAN 上。

选择不必要的列还会迫使 Oracle 在不更改计划的情况下执行额外的 I/O。例如,如果表中您不需要的列之一是 LOB,Oracle 就必须执行额外的工作来获取该 LOB 数据。如果数据存储在磁盘上的链式 block 中,但您感兴趣的列恰好位于第一个行片段中,则 Oracle 不必为指定列子集的查询获取其他行片段。另一方面,执行 select * 的查询必须获取每个行片段。

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

关于sql - oracle 中 select * 与 select colname 的性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11893096/

相关文章:

php - 更新错误 : Column count doesn't match value count at row 1

sql - "local collection types not allowed"PL/SQL 错误 ORA-06550

django - 我将 Django 与远程 Oracle 数据库一起使用,并收到 "Table does not exist"错误

oracle - dblink 上的同义词或 View

database - 如何在oracle中选择最后一次出现的重复记录

mysql - 高 5 分钟平均负载的奇怪案例

mysql - 足球数据库模式

SQL SELECT id 和同一个表中的项目数

mysql - 复合主键,显示一同一异的条目

mysql - 如何使用案例创建触发器