LoginSignup
4
1

More than 5 years have passed since last update.

ストアド・プロシージャの実行速度についてベンチマークをとってみました

Last updated at Posted at 2018-12-16

はじめに

この記事はユニークビジョン株式会社 Advent Calendar 2018の16日目の記事です。
弊社ではSQLを書く際に良くストアド・プロシージャを使用します。
使用する理由として自分が理解しているところでは、以下の2点です。
①通常のSQLやORマッパーに比較してパフォーマンスが向上する。
②複雑な処理などを書きやすい
そこで今回①について、どのくらい速いのかを検証してみたいと考えています。

準備

適当なTABLEとレコードを用意

なんとなくECサイトっぽく、顧客、注文、注文に紐づく明細、それから商品のテーブルを用意します。
スクリーンショット 2018-12-16 20.46.06.png

ストアド・プロシージャを用意

①明細テーブルのレコード全件の数を取得する単純なストアド・プロシージャ
スクリーンショット 2018-12-16 20.52.28.png

②全てのテーブルを結合し、明細が複数ある注文の件数を取得するストアド・プロシージャ
スクリーンショット 2018-12-16 20.55.48.png

ベンチマークを計測するクラスを用意(1枚にまとまりませんでした)

スクリーンショット 2018-12-16 20.59.42.png
スクリーンショット 2018-12-16 20.59.58.png
スクリーンショット 2018-12-16 21.00.07.png
スクリーンショット 2018-12-16 21.00.14.png

一応画面上に出力されるA,B,C,D,Eは以下のとおりとなります。
①A:生SQLで明細テーブルのレコード全件の数を取得
②B:ストアド・プロシージャで明細テーブルのレコード全件の数を取得
③C:Active Recordの機能で明細テーブルのレコード全件の数を取得
④D:生SQLで全てのテーブルを結合し、明細が複数ある注文の件数を取得
⑤E:ストアド・プロシージャで全てのテーブルを結合し、明細が複数ある注文の件数を取得

実行結果

スクリーンショット 2018-12-16 21.09.20.png

計測に使用したのはBenchmarkというRuby標準のライブラリーとなります。
詳しい使い方や結果の見方などはこちらの記事になり、参考にさせていただきました。

今回はそれぞれでuserの欄を見ればいいのですが、結果としてストアド・プロシージャを使用したほうが生SQLより若干処理速度が速く、また生SQL、ストアド・プロシージャ共にActive Recordよりかなり速いという結果がわかりました。
(Active Recordで複雑な条件のレコード数を取得する方法がわからなかったので行っておりません)

まとめ

ということでやはりストアド・プロシージャは速かったという結果になります。
ただ自分のストアド・プロシージャについての理解などが間違っている可能性もあるため、ご指摘等いただければ幸いです。

次回は@s_itoさんです!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1