Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 结果设置并选择*性能_Java_Oracle_Spring_Jdbc_Resultset - Fatal编程技术网

Java 结果设置并选择*性能

Java 结果设置并选择*性能,java,oracle,spring,jdbc,resultset,Java,Oracle,Spring,Jdbc,Resultset,我正在重构一些Spring JDBC代码,其中一些代价更高的查询执行“选择*自…”,并准备开始检查实际需要哪些列,然后从..中选择x,y。但是通过ResultSet类进行读取似乎发现大多数数据都是延迟加载的。执行ResultSet.next()时,它会移动数据库中的光标(此应用程序中为Oracle 10g),执行ResultSet.getXX()时,它会检索该列。所以我的想法是,如果你做了一个“选择*”,但只检索你想要的列,那么你就不会真正受到性能的影响。我想得对吗?我能想到的唯一一个地方是数据

我正在重构一些Spring JDBC代码,其中一些代价更高的查询执行“选择*自…”,并准备开始检查实际需要哪些列,然后从..中选择x,y。但是通过ResultSet类进行读取似乎发现大多数数据都是延迟加载的。执行ResultSet.next()时,它会移动数据库中的光标(此应用程序中为Oracle 10g),执行ResultSet.getXX()时,它会检索该列。所以我的想法是,如果你做了一个“选择*”,但只检索你想要的列,那么你就不会真正受到性能的影响。我想得对吗?我能想到的唯一一个地方是数据库内部,因为它将查询结果存储在内存中,并且需要使用更多的内存,如果只选择了几行,则需要使用更多的内存,但如果它实际上只存储指向命中查询的列的指针,则即使是这种情况也不会发生

想法


注意:这只适用于标准的结果集,我知道缓存结果集的作用不同。

如果从“选择*”改为“选择A、B、C”会给您带来任何有意义的性能改进,除非您有大量不需要的列

这一切都非常依赖于您的数据库、驱动程序和应用程序,大多数概括都是毫无意义的


您将从中得到的唯一可靠答案是通过基准测试-尝试“选择*”,尝试“选择A、B、C”,看看是否有值得追求的改进。

我确实知道,在我参与的一个应用程序中,在大数据量(和大表大小)下,从选择*更改为选择x,y确实给我们带来了一点性能提升。但是,我强烈建议您使用分析工具,如Oracle的内置分析工具或外部分析工具,并使用大型数据集来规范化噪声(如网络流量、硬盘驱动器加速、太阳黑子等)

在我工作过的环境中,作为一项规则,SELECT*永远不会使用。我相信skaffman&aperkins关于性能增益很小的说法可能是正确的。作为一名数据库开发人员,我有一个强烈的观点,那就是您应该始终命名要检索的列,但我想这可能没有真正的依据


嗯。。。我想,从可维护性的角度来看,有人可能会说,命名正在检索的列有助于自我记录代码。SELECT*不会给其他开发人员提供更多的信息。我不确定这是否是因为性能上的小优势而需要额外的输入。

我支持@skaffman和其他人的观点,这最多也只是一点小小的收获。如果您考虑Oracle如何检索数据并记住它是块I/O,那么不管您在客户机中请求哪些列,数据库都将获取记录所在的整个块。如果您的客户机总是检索整个记录(例如,在SQL*Plus中执行SELECT*操作),那么性能可能会有所提高,但在您的情况下,如果您要求传输数据,则可能不会有太多

对于已编译的应用程序,“选择*”可能是有害的。如果表发生更改,代码可能会中断。这就是为什么我不会用它

编辑:在这里仔细考虑所有优秀的回答:

  • Justin对某些情况下可能出现的显著性能改进提出了很好的观点
  • Codemonkey在自我记录代码方面做得很好
  • Aperkins和skaffman提出了最好的建议之一:尝试一下,测量一下,看看你自己的情况会有什么影响
  • +到处都是。。。
    我看不到有人对自己推荐使用“选择*”而感到失望。如果可以很容易地指定所需的确切列,我会修改代码来完成此操作。

    根据表结构、Oracle版本和所涉及的索引,完全有可能通过更好地更改查询计划来更改正在选择的列集,从而大大提高性能。对于大多数查询,性能优势可能很小,但总的来说,显式命名列通常是一种良好的做法

    当您有一个优化器可以使用的“覆盖索引”时,最简单的情况就是性能会得到提高。如果选择的所有列和筛选的所有列都是单个索引的一部分,则该索引是查询的覆盖索引。在这种情况下,Oracle可以避免从表中读取数据,而只读取索引

    在其他情况下,性能也将得到改善。如果存在不影响最终输出的临时联接,那么优化器可能能够执行查询。如果选择所有列,则无法进行优化。如果表中有链接行,则删除列也可以消除获取已删除列所在的其他块的需要。如果表中有LONG列和LOB列,不选择这些列也会带来很大的改进

    最后,删除列通常会减少Oracle在通过网络传送结果之前对结果进行排序和散列所需的空间量。而且,即使结果集可能会在应用服务器的RAM中延迟加载数据,它也可能无法通过网络延迟获取列。如果从表中选择所有列,JDBC驱动程序可能必须一次至少获取一个完整的行(更可能是每次网络往返获取10或100行)。而且由于驱动程序不知道何时获取数据,所以哪些列将是r