2

During execution of a program that relies on the oracle.sql package there is a large performance hit for persisting > 200 million Timestamps when compared to persisting the same number of longs.

Basic Schema

Java to persist:

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

My question is what does Oracle do to Timestamps that make them so awful to insert in a bulk manner?

Configuration:

64 bit RHEL 5  
jre 6u16  
ojdbc14.jar
64 GB dedicated to the JVM

UPDATE
java.sql.Timestamp is being used

4

3 回答 3

1

添加到 Srini 的帖子中,有关数据类型的内存使用的文档:

Oracle Doc on Data Types: http ://docs.oracle.com/cd/E11882_01/timesten.112/e21642/types.htm#autoId31 (包括数字和时间戳的内存大小)

文档指出 Number 占用 5-22 个字节,Timestamp 占用 11 个字节,Integer 占用 4 个字节。

另外-关于查询日期范围的观点-您是否可以将日期插入长值而不是时间戳,然后在查询数据时使用存储过程进行转换?这显然会影响查询的速度,因此它可能会解决问题,但是.... :)

于 2012-09-26T20:59:27.677 回答
1

Oracle 时间戳不存储为绝对值,因为像 java.sql.Timestamp 这样的 epoc 在内部保存。它是一个大位掩码,包含各种“人类”字段、世纪、月份等的值。

因此,您的每个纳秒自纪元时间戳都会在存储之前被解析为“人类”日期。

于 2012-09-25T20:35:44.337 回答
1

Number 占用 4 个字节,Timestamp 占用 11 个字节。此外,Timestamp 具有与之关联的元数据。对于每个时间戳,Oracle 似乎都会计算元数据并与字段一起存储。

于 2012-09-25T20:33:55.643 回答