より高速なフェッチ、再考
先日、クライアントを訪ねた際、大量のデータセットを取り出すために、複数オカレンス データ構造への複数行FETCHを使用しているのを目にしました。複数オカレンス データ構造の代わりに、どうしてデータ構造配列を使用しないのか尋ねたところ、 『IT Jungle』のある記事 を紹介されました。それは、組み込みSQL使用時に、1度に1行のFETCHと複数行FETCHではどちらが高速かという質問に対して、Ted Holtが回答している記事でした。
Tedは、1度に1行のFETCHと、データ構造配列への複数行FETCHと、複数オカレンス データ構造への複数行FETCHとで比較を行っていました。記事の最後で、Tedは次のように結んでいます。「テストしたファイルには130万件のレコードがありました。最初の2つのプログラムは、CPU時間を11秒使用しました。一方、最後のプログラムは、CPU時間を7秒使用しただけでした。配列データ構造の使用は、1行フェッチに比べて高速というほどではありませんでした。複数オカレンス データ構造は配列データ構造より高速でした。」
Tedと意見を異にすることになるのは気が進まないものがありますが、彼の結論と私の経験とは一致しないところがあるようです。私は、データ構造配列と複数オカレンス データ構造のパフォーマンスは同じくらいだと考えます(裏を返せば、両者にとってまったく同じプロセスであるはずです)。そして、両者は1度に1行のFETCHより高速だと私は思います。
Tedの記事からそれらのプログラムをコピーし、詳細を印刷するためのロジックを除去し、カーソルの宣言とカーソルのクローズとの間の時間の長さ(ミリ秒単位)を計算するロジックを追加しました。これら3つのプログラムは、同じフォーマットおよび同じ行数のデータベース上で動作しました。 以下は、1度に1行のFETCHを実行したプログラムのコードです。
以下は、データ構造配列への複数行FETCHを使用した同等のプログラムです。
以下は、複数オカレンス データ構造への複数行FETCHを使用した同等のプログラムです。
3つのプログラムを複数回、異なる組み合わせで呼び出しました。呼び出しのたびに、多少の違いは常にありましたが、3者の間での実行時間の違いは、以下のようになりました。
方法 | 時間 |
---|---|
1行 | 14161000 |
配列 | 1835000 |
MODS(複数オカレンス データ構造) | 1842000 |
複数行FETCHは両方とも、常に1行FETCHに比べて約8倍高速でした。複数オカレンス データ構造へのFETCHと、データ構造配列へのFETCHの差はごくわずかであり、これは私のシステムが別の処理を行っていたことで簡単に説明が付くものでした。たいていはデータ構造配列プログラムの方が高速でした(僅差)が、何回かのテストでは、複数オカレンス データ構造プログラムのほうが高速だったこともありました(僅差)。 したがって、複数行FETCHは、1度に1行のFETCHに比べて大幅に高速だと言えそうです。そして、データ構造配列と複数オカレンス データ構造とで選べるとしたら、管理しやすく分かりやすいということで、私ならデータ構造配列を選ぶでしょう。