#はじめに
この記事はユニークビジョン株式会社 Advent Calendar 2018の16日目の記事です。
弊社ではSQLを書く際に良くストアド・プロシージャを使用します。
使用する理由として自分が理解しているところでは、以下の2点です。
①通常のSQLやORマッパーに比較してパフォーマンスが向上する。
②複雑な処理などを書きやすい
そこで今回①について、どのくらい速いのかを検証してみたいと考えています。
#準備
###適当なTABLEとレコードを用意
なんとなくECサイトっぽく、顧客、注文、注文に紐づく明細、それから商品のテーブルを用意します。
###ストアド・プロシージャを用意
①明細テーブルのレコード全件の数を取得する単純なストアド・プロシージャ
②全てのテーブルを結合し、明細が複数ある注文の件数を取得するストアド・プロシージャ
###ベンチマークを計測するクラスを用意(1枚にまとまりませんでした)
一応画面上に出力されるA,B,C,D,Eは以下のとおりとなります。
①A:生SQLで明細テーブルのレコード全件の数を取得
②B:ストアド・プロシージャで明細テーブルのレコード全件の数を取得
③C:Active Recordの機能で明細テーブルのレコード全件の数を取得
④D:生SQLで全てのテーブルを結合し、明細が複数ある注文の件数を取得
⑤E:ストアド・プロシージャで全てのテーブルを結合し、明細が複数ある注文の件数を取得
計測に使用したのはBenchmarkというRuby標準のライブラリーとなります。
詳しい使い方や結果の見方などはこちらの記事になり、参考にさせていただきました。
今回はそれぞれでuserの欄を見ればいいのですが、結果としてストアド・プロシージャを使用したほうが生SQLより若干処理速度が速く、また生SQL、ストアド・プロシージャ共にActive Recordよりかなり速いという結果がわかりました。
(Active Recordで複雑な条件のレコード数を取得する方法がわからなかったので行っておりません)
#まとめ
ということでやはりストアド・プロシージャは速かったという結果になります。
ただ自分のストアド・プロシージャについての理解などが間違っている可能性もあるため、ご指摘等いただければ幸いです。
次回は@s_itoさんです!