« テキストファイルに対してSQL | Main | テンプレートエンジン »

2004.04.06

SQL関数とパフォーマンス

 SQLを使用する際、今までは既に定義されている関数(SUMとかSUBSTRとか)しか使ったことがなかったのですが、今回思い立って、SQL関数の作成に挑戦してみました。といっても、いきなり複雑なものを作ろうとすると挫折してしまいそうなので、普段はSQLで取得した結果を元にJava側で処理を行っていた演算を、SQL関数に移植することに。でも、とりあえずどのように記述すればいいのかさっぱりわからないので、一番最初に作成したのは、DBサーバの参考資料に書かれていたCREATE FUNCTION(SQLスカラー)のサンプルソースそのものでした(笑)。
 CREATE FUNCTIONは普通にStatementを作成してexecuteUpdateで実行できるので、普段使っているSQLツール(自作)で処理・・・と思ったところ、セミコロンをSQL文の区切り文字として使用していたので、その部分を修正する必要が発生してしまいました。そんなこんなで作成したSQL関数を、SELECT文に組み込んでテスト実行。案外簡単に作成&使用できるんですね(^^)。

 次に、オリジナルの関数の作成。まぁ、処理の内容自体は変数への割り当て(SETコマンド)と、条件分岐(IF〜ELSE〜END IF)程度で記述できる程度のものなので、先ほど参考にしたソースを元にあれこれ試行錯誤。
 何度か作成に失敗するものの、とりあえずは無事に完成。executeUpdateでの作成の場合、エラーが出ても「どこでエラーが出ているのか」が非常にわかりにくくて大変ですね(苦笑)。一応、SQLExceptionのメッセージは表示されているのですが、具体的にどの部分なのかが不明な場合も。せいぜい10行〜数十行のソースなので、じっくりとソースを見直すことで何とか解決できましたが。

 ただ、データ量が多くなるとかなりの負荷がかかってしまうようで、約13万レコードに対して処理を行うようなSELECT文を作成したところ、反応が戻ってくるまでに600秒ほどかかってしまいました(爆)。いろいろと調べてみると、IFステートメントをCASEで置き換えることができる場合はCASEステートメントの方がパフォーマンスがいい場合が多いとのこと。今回作成したSQL関数のIFステートメントもCASEで置き換えることができるような内容だったので、プログラムを書き直して再作成。最終的な状態では、同じ処理が70秒程度まで改善されました。GROUP BYなども使用しており、今回作成したSQL関数を使用しない状態でも30秒〜40秒程度かかっていたので、まぁ、許容範囲? 逆に、DBサーバ側でのGROUP BYでこれまでより取得レコード数を劇的に減らすことができるため、APサーバ側での負荷の軽減を考えると、いい感じと言えそうです。

|

« テキストファイルに対してSQL | Main | テンプレートエンジン »

DB」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/406133

Listed below are links to weblogs that reference SQL関数とパフォーマンス:

« テキストファイルに対してSQL | Main | テンプレートエンジン »