« 任天堂「スマブラX」に参加する音楽家達がエライことになっている | メイン | ニコニコ動画にあわせてタッチタイピング「Typing Tube」(タイピングチューブ) »

JavaのPreparedStatementはINSERTでは速いが、SELECTではそうでもない

※ちょっと勘違いしてました。修正してます。

iioka@この辺はフレームワークで対応すべきだと思ってます
です。

以前、このブログで「PreparedStatementは速い!」というエントリーを書きました。
その話のきっかけは、Java日本ユーザー会の結成総会に行ったからなのですが、
そのときの資料(PDF)が公開されています。

日本 Java ユーザグループ

資料は細川努氏の「Javaとデータベース」のものになります。

PDFによると、INSERTでは明らかに速かったPreparedStatementも、
SELECTではあまり高速化が図れないそうです。
(※「あまり」というのは、INSERTの時のデータに比べて、という意味です)
今まで何でもPreparedStatementでやっていましたが、
発行するクエリーに応じて使い分けるのがベターですね。

(※PreparedStatementのままで大丈夫でした。)

※データはあくまで細川氏の環境によるものなので、全ての環境で同じ結果を出すとは限りません。

資料では他にもJDBCやデータアクセスの方法などが紹介されています。
興味のある方はぜひ。

コメント (2)

k2:

>INSERTでは明らかに速かったPreparedStatementも、SELECTではあまり高速化が図れないそうです。

資料を拝見しましたが、iiokaさんが誤認されているのではないでしょうか?

データを1000件登録するためには必ずINSERT文を1000回発行しなければならないのに対して、データを1000件取得するためにSELECT文を1000回発行する必要はありません。

資料11ページの「通常」とは「Statement#executeQuery」メソッドを実行した回数、「Prepare」とは「PreparedStatement#executeQuery」メソッドを実行した回数、「Fetch」とは「Statement#executeQuery」メソッドを1回実行して取得したResultSetに対して「next」メソッドを実行した回数だと思います。

そう考えると「Fetch」がダントツに早いのは当たり前で、今までどおり何でもPraparedStatementを使用するのが適切かと思います。

iioka:

>k2

どうもiiokaです。
改めて資料を見直しました。
指摘通り、単純に「SELECT文1000回発行するパフォーマンス」を比較したものだと思ってました。
ご指摘ありがとうございます。

いずれにしても、
PreparedStatementのパフォーマンスがStatementに劣っているわけではないので、
>発行するクエリーに応じて使い分けるのがベターですね。
という言い方はよろしくないですね。

なおしておきます。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

スポンサーサイト