1
6
这一切都非常依赖于您的数据库、驱动程序和应用程序,大多数概括都是毫无意义的。
|
2
4
根据表结构、Oracle版本和所涉及的索引,完全有可能通过更好地更改查询计划来更改所选择的列集,从而显著提高性能。对于大多数查询,性能优势可能很小,但总的来说,显式命名列通常是一种良好的做法。 当您有一个优化器可以使用的“覆盖索引”时,最简单的情况就是性能会得到提高。如果选择的所有列和筛选的所有列都是单个索引的一部分,则该索引是查询的覆盖索引。在这种情况下,Oracle可以避免从表中读取数据,而只读取索引。 在其他情况下,性能也将得到改善。优化器可能能够执行以下操作: table elimination 如果有查询,则存在不会影响最终输出的临时联接。如果选择所有列,则无法进行优化。如果表中有链接行,则删除列也可以消除获取已删除列所在的其他块的需要。如果表中有LONG列和LOB列,不选择这些列也会带来很大的改进。 最后,删除列通常会减少Oracle在通过网络传送结果之前对结果进行排序和散列所需的空间量。而且,即使结果集可能会在应用服务器的RAM中延迟加载数据,它也可能无法通过网络延迟获取列。如果从表中选择所有列,JDBC驱动程序可能必须一次至少获取一个完整的行(更可能是每次网络往返获取10或100行)。而且,由于驱动程序不知道何时获取数据以及将请求哪些列,因此您必须通过网络发送所有数据。 |
3
3
我知道,在我参与的一个应用程序中,大数据量(和大表大小)从 挑选* 到 选择x,y |
4
3
在我工作过的环境中,作为一项规则,SELECT*从未被使用过。我相信斯卡夫曼公司,;aperkins关于性能增益很小的说法可能是正确的。作为一名数据库开发人员,我有一个强烈的观点,那就是您应该始终命名要检索的列,但我想这可能没有真正的依据。 六羟甲基三聚氰胺六甲醚。。。我想,从可维护性的角度来看,有人可能会说,命名正在检索的列有助于自我记录代码。SELECT*不会给其他开发人员提供更多的信息。无论是否,;性能上的小优势证明了额外输入的合理性,我不确定。 |
5
3
我支持@skaffman和其他人的观点——充其量只是一点小小的收获。如果您考虑Oracle如何检索数据并记住它是块I/O,那么不管您在客户机中请求哪些列,数据库都将获取记录所在的整个块。如果您的客户机总是检索整个记录(例如,在SQL*Plus中执行SELECT*操作),那么性能可能会有所提高,但在您的情况下,如果您要求传输数据,则可能不会有太多。 对于已编译的应用程序,“选择*”可能是有害的。如果表发生更改,代码可能会中断。这就是为什么我不会用它。
+到处都是。。。 我看不到有人对自己推荐使用“选择*”而感到失望。如果很容易指定所需的确切列,我会修改代码来实现这一点。 |
6
1
在切换语句时,我从来没有注意到其中一个语句与另一个语句之间有任何性能提升—我相当肯定Oracle会首先获取整行内容,而不管通配符或列规格如何。在此之前,要检查的性能因素要大得多(索引、硬盘速度等)。
|
Samuel Ludwig · 执行查询[重复]后立即关闭结果集 6 年前 |
Peter · 为什么在生成的jar中找不到jdbc驱动程序?[副本] 6 年前 |
Vince · 是否遍历DataProvider的JDBC结果集? 6 年前 |
Kask · spark将字符串转换为时间戳类型 6 年前 |
watery · 等待jdbc出站通道适配器完成,然后再进行进一步处理 6 年前 |