我有一个案例,我需要有效地将约100万行加载到内存中进行处理。我正在使用oracle和普通JDBC。
如果我没有设置获取大小,则使用oracle驱动程序默认值10意味着它将需要100k往返,这使得性能超级低效。如果我将获取大小提升到非常大的值,例如500k或1m,则数据将在大约5秒内加载。
不幸的是,我无法将获取大小设置为类似INT_MAX,因为oracle驱动程序根据获取大小预先分配缓冲区。
我真正想要的是一种强制JDBC简单地获取所有行而不使用游标或进行任何增量提取的方法。我想以最有效的内存方式做到这一点。
有没有办法告诉oracle获取所有数据并且不进行任何提取?
答案 0 :(得分:1)
12驱动程序在记录的提取大小和实际数据大小中每行每列分配15个字节。因此,如果您将获取大小设置为1G,则12个驱动程序将为簿记分配15GB以及实际数据。因此,根据您拥有的内存量,您可以将获取大小设置为您要支持的内存。
前12个驱动程序分配了更多,更多的内存,因此获取大小必须小得多。
没有办法告诉司机在一次往返中只获取所有行。
编辑2017-03-10:我们测试了最多2G行,最近发布的12.2驱动程序使用FORWARD_ONLY结果集处理此罚款。它们将使用SCROLL_INSENSITIVE结果集处理最多1,802,723,000行。这是预期的限制。很明显,这是一个巨大的机器和巨大的堆。