|
||||||||||||||||||||
| 前のページ 1 2 3 次のページ | ||||||||||||||||||||
| テスト其の壱 〜 データの登録 | ||||||||||||||||||||
|
最初はデータ登録のパフォーマンステストです。データを大量に登録するだけの場合の速度を比較します。 |
||||||||||||||||||||
| insert文によるデータ登録 | ||||||||||||||||||||
|
まずは地道にinsertを繰り返してデータを登録する単純な操作の場合です。 |
||||||||||||||||||||
![]() 図1:10万件insert実行時の速度 |
||||||||||||||||||||
|
インデックス有りの場合、無しの場合共に、PostgreSQLの方はOracleの30%強程度(およそ1/3)の時間でデータを登録できました。 表データは数値型の列が4つ、文字型の列が3つで計116byteの可変長ですが、実際に登録した文字データは列サイズの60〜70%程度を占めるものです。 当然ですが、insert文では表データを新たに書き込みます。この操作で発生するコストの大部分はディスクI/Oに費やされますが、データそのものは同じ値を使用していますから、差が出た部分はそれ以外の部分の量や処理の大きさによると考える事ができます。 Oracleのデータ書き込みの方が、ロールバック情報やREDO情報の書き込みなどがあるため複雑であり、その分時間を必要とするためこのような結果となっていると考えられます。なお、表は新規作成直後に使用しているため、フラグメント等は発生しない状況であった事を付け加えておきます。また、同一条件にするため、Oracle側で一般的なI/Oの分散も行っていません。 インデックスは数値型列の3つに作成され、その内の1列が主キー索引です。すべて数値型列の索引であり、索引自体のサイズが表のサイズに比較して小さかった為、索引の有無がそれほど大きな負荷とはならなかったようです。PostgreSQLで7%、Oracleで6%ほどの差でしかありません。 |
||||||||||||||||||||
| SQL*Loaderによるデータ登録 | ||||||||||||||||||||
|
実際に大量データを一度に登録する場合、その用途にもよりますが、insert文を繰り返すのではなく、OracleならばSQL*Loader、PostgreSQLならばpsqlのcopy … fromコマンドを用いる方が一般的かもしれません。 insertによるテストと同じデータを使用して、SQL*Loaderによる処理を行った場合の結果を次に示します。 |
||||||||||||||||||||
![]() 図2:Oracle SQL*Loader使用時の比較 |
||||||||||||||||||||
|
OracleでSQL*Loaderを用い、同一データをロードした場合、insert実行時の3%程度の時間で登録できました。directモードならばさらに短縮できます。テスト環境では比較的メモリに余裕があったため、バッファを大きく取ったこともあってここまで大きな差となって結果が現れました。データ量が増えるとこの差はさらに広がる傾向にあります。 |
||||||||||||||||||||
|
前のページ 1 2 3 次のページ |
||||||||||||||||||||
|
|
||||||||||||||||||||
|
|
||||||||||||||||||||
|
||||||||||||||||||||
|
|
||||||||||||||||||||
|
||||||||||||||||||||
|
|
||||||||||||||||||||
|
||||||||||||||||||||
|
|
||||||||||||||||||||



