Gan*_*alf 5 java oracle spring jdbc resultset
我正在重构一些Spring JDBC代码,其中一些成本较高的查询执行"SELECT*FROM ..." - 并且即将开始检查实际需要哪些列,而只是SELECT x,y FROM ..它们.但通过ResultSet类读取似乎大多数数据都是延迟加载的.当您执行ResultSet.next()时,它会移动数据库中的游标(此应用程序中的Oracle 10g),当您执行ResultSet.getXX()时,它会检索该列.所以我的想法是,如果你做一个"SELECT*"但只检索你想要的列,你并没有真正受到性能影响.我正确地考虑了这个吗?我能想到的唯一可以解决这个问题的地方是数据库,因为它将查询结果存储在内存中并且必须使用更多内存,如果只选择了几行,那么它实际上只会存储指向那些击中查询的列甚至不是这种情况.
思考?
注意:这仅适用于标准ResultSet,我知道CachedResultSet的行为不同.
如果从"SELECT*"到"SELECT A,B,C"给你带来任何有意义的性能提升,我会感到惊讶,除非你有大量你不需要的列.
这完全取决于您的数据库,驱动程序和应用程序,并且大多数概括都将毫无意义.
你将从中获得唯一可靠的答案是通过基准测试 - 尝试"SELECT*",尝试"SELECT A,B,C",看看是否有值得追逐的改进.
根据表结构、Oracle 版本和所涉及的索引,更改您选择的列集完全有可能通过更改查询计划来显着提高性能。对于大多数查询来说,性能优势可能很小,但总体而言,显式命名列通常是一种很好的做法。
当您拥有优化器可以使用的“覆盖索引”时,会发生性能提高的最简单情况。如果您选择的所有列以及您筛选所依据的所有列都是单个索引的一部分,则该索引是查询的覆盖索引。在这种情况下,Oracle 可以避免从表中读取数据,而只需读取索引。
在其他情况下,性能也会得到提高。如果您查询存在不影响最终输出的临时联接,优化器可能能够执行表消除。如果您选择所有列,则无法进行优化。如果您的表具有链接行,则消除列还可以消除获取已消除列所在的附加块的需要。如果表中有 LONG 和 LOB 列,不选择这些列也会带来很大的改进。
最后,消除列通常会减少 Oracle 在通过网络传输结果之前对结果进行排序和散列所需的空间量。即使 ResultSet 可以延迟加载应用程序服务器 RAM 中的数据,它也可能无法通过网络延迟获取列。如果您从表中选择所有列,则 JDBC 驱动程序可能必须一次至少获取 1 个完整行(更有可能的是每次网络往返获取 10 或 100 行)。由于驱动程序不知道何时获取数据以及将请求哪些列,因此您必须通过网络传输所有数据。
| 归档时间: |
|
| 查看次数: |
3090 次 |
| 最近记录: |