テスト其の壱 〜 データの登録
テスト其の壱 〜 データの登録
最初はデータ登録のパフォーマンステストです。データを大量に登録するだけの場合の速度を比較します。
insert文によるデータ登録
まずは地道に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による処理を行った場合の結果を次に示します。

OracleでSQL*Loaderを用い、同一データをロードした場合、insert実行時の 3%程度の時間で登録できました。directモードならばさらに短縮できます。テスト環境では比較的メモリに余裕があったため、バッファを大きく取った こともあってここまで大きな差となって結果が現れました。データ量が増えるとこの差はさらに広がる傾向にあります。