2

パッケージに依存するプログラムの実行中にoracle.sql、同じ数の long を永続化する場合と比較して、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

私の質問は、オラクルがタイムスタンプを大量に挿入するのを非常にひどいものにするために何をしているのかということです。

構成:

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

更新
java.sql.Timestampが使用されています

4

3 に答える 3

1

数値は 4 バイト、タイムスタンプは 11 バイトです。さらに、タイムスタンプにはメタデータが関連付けられています。タイムスタンプごとに、Oracle はメタデータを計算し、フィールドに格納するようです。

于 2012-09-25T20:33:55.643 に答える
1

データ型ごとのメモリ使用に関するドキュメントについて、Srini の投稿に追加します。

データ型に関する Oracle Doc: 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 のようなエポックが内部的に保持されるため、絶対値として格納されません。これは、さまざまな「人間」のフィールド、世紀、月などの値を含む大きなビットマスクです。

したがって、ナノ秒以降のエポックタイムスタンプのそれぞれは、保存前に「人間の」日付に解析されます。

于 2012-09-25T20:35:44.337 に答える