在执行依赖于oracle.sql
程序包的程序期间,持久性>的性能会受到很大影响。与持续相同数量的多头相比,有2亿个时间戳。
Java坚持:
Collection<ARRAY> longs = new ArrayList<ARRAY>(SIZE);
Collection<ARRAY> timeStamps = new ArrayList<ARRAY>(SIZE);
for(int i = 0; i < SIZE;i++)
{
longs.add(new ARRAY(description, connection, i));
timeStamps.add(new ARRAY(description,connection,new Timestamp(new Long(i)));
}
Statement timeStatement = conn.createStatement();
statement.setObject(1,timeStamps);
statement.execute(); //5 minutes
Statement longStatement = conn.createStatement();
statement.setObject(1,longs);
statement.execute(); //1 minutes 15 seconds
我的问题是Oracle对Timestamps做了什么让他们以批量方式插入它们太糟糕了?
配置:
64 bit RHEL 5
jre 6u16
ojdbc14.jar
64 GB dedicated to the JVM
更新
正在使用java.sql.Timestamp
答案 0 :(得分:1)
Number需要4个字节,Timestamp需要11个字节。此外,Timestamp具有与之关联的元数据。对于每个时间戳,Oracle似乎计算元数据并与字段一起存储。
答案 1 :(得分:1)
Oracle时间戳不会存储为绝对值,因为epoc就像java.sql.Timestamp在内部持有一样。这是一个很大的位掩码,包含各种“人类”领域的价值,几个世纪,几个月等。
因此,每个纳秒级的时间戳都会在存储之前被解析为“人类”日期。
答案 2 :(得分:1)
添加到Srini的帖子,有关数据类型的内存使用文档:
关于数据类型的Oracle Doc: http://docs.oracle.com/cd/E11882_01/timesten.112/e21642/types.htm#autoId31(包括Number和Timestamp的内存大小)
文档说明Number需要5-22个字节,Timestamp需要11个字节,Integer需要4个字节。
另外 - 在查询日期范围时 - 您可以将日期作为长值而不是时间戳插入,然后在查询数据时使用存储过程进行转换吗?这显然会影响查询的速度,所以它可能会引发问题,但......:)