2023年5月11日〜5月13日に渡って長野県松本市で開催される RubyKaigi 2023 に、ピクシブから技術開発本部インフラ部の末吉(@sue445)が登壇します。
- Fix SQL N+1 queries with RuboCop
- 【おまけ】Proposalの書き方の参考リンク
- 【宣伝】Music Event SponsorとしてRubyMusicMixin 2023を開催します
Fix SQL N+1 queries with RuboCop
5月12日(2日目)に登壇予定です!
トークの内容
1人チームでISUCONに出るために1年かけて作ったgemの話をします。
rubocopの中でSQLのASTをparseしてN+1クエリを自動修正してる辺りはかなりの面白ポイントなので、来年のRubyKaigiのCFPに応募しようと思っています。(このgemだけで1時間話せるくらいのボリュームはある)
この辺の話をします。
Proposal
実際に採択されたProposalはこちらになります。
今後Proposalを出す時の参考にしてください。
Title
Fix SQL N+1 queries with RuboCop
Abstract
ISUCON is most famous performance turning contest in Japan. https://isucon.net/
I created https://github.com/sue445/rubocop-isucon for ISUCON. This gem automatically modifies SQL N+1 queries with RuboCop.
I'll talk about why I did this CRAZY thing and the technology it took to do this.
Details
https://github.com/sue445/rubocop-isucon (ISUCONのRubyの参照実装を自動で改善するcop)についての話をします。
このgemはISUCON11の予選敗退直後(2021年8月)に作り始めてISUCON12(2022年7月開催)の予選に実戦投入しています。(開発期間は約1年)
https://sue445.hatenablog.com/entry/2022/07/24/190412
トークのメインテーマは「SQLのN+1クエリをRoboCopで自動修正する」ですが、そこに至るまでの長い道のりを順序立てて話したり、N+1修正以外で作ったrubcop-isuconのcopの紹介をしたいと思ってます。
RuboCopといえば通常Rubyのソースコードをパースして Ruby のASTを取得し、そのASTを元に特定のルールに基づいた違反の検出やソースコードの自動修正(auto correct)を行う用途で利用されることが多いでしょう。
しかしrubocop-isuconではRubyのASTだけにとどまらずSQL文字列もパースして SQL のASTを取得し、それをRuboCop内での違反検出やauto correctに利用しています。
具体的には
- copからDBに接続して実際のDBのスキーマ情報を取得し、それをcop内の解析で利用
- 例:indexがついてないカラムをWHERE句で使ってたらcopで検知
- RubyでSQL文字列をパースしてSQLのASTを取得する
- いくつかライブラリを比較検討して最終的に https://github.com/tenderlove/gda にいきついたけど、アーロン製のgemというのも面白ポイントの1つ
- SQLのASTをRubyの世界に持っていく。 (ASTの異世界転生)
- RuboCopで扱うASTのnodeにはRubyのソースコード内の位置情報が含まれており、RuboCopはこれをもとにauto correctを行っている
- しかしlibgdaで取得したSQLのASTのnodeには位置情報が含まれていないため、SQLのASTのnodeは自分自身がSQL文字列中のどこに位置しているかを知ることができない
- そのため、SQLのASTの各nodeに位置情報を付与する仕組みを作成し、RuboCopのauto correctで利用できるようにした
- RoboCopでauto correctしやすいN+1クエリについて
辺りが技術的に面白いのではと思ってます。
社内勉強会で発表した下記資料がベースになりますが、1年以上前の資料なので大幅に加筆修正が入ると思います。
- (注:ここに社内勉強会で発表した資料のURLを貼ってたが不特定多数に公開する用途ではないので削除)
Pitch
箇条書きで書くとだいたいこんな感じです。
- 昨今のウェブアプリケーションではなんらかのRDBの恩恵に預かってることが多いため聴講者にとっては身近なテーマ
- 静的解析というアプローチからパフォーマンスチューニングに挑んでる事例はあまりない
- 世の中にカスタムcopはたくさんあるが、copの中からDBに接続したりSQLをパースするというcopはおそらく他に存在しない
- 少なくとも自分は見つけられなかった
- そもそもRubyでSQLのASTを扱う事例があまりない
Detailsに書いたようにrubocop-isuconは技術的な面白ポイントを色々盛り込んでいるので、このトークを聞いた人に明日から使える面白copネタを持ち帰ってもらいたいと思っています。
補足
TitleとAbstractはサイトに公開されるものなので全て英語で記載してますが、Details(発表のテーマや流れ)とPitch(このCFPを採択すべき理由やアピール文)に関してはレビュアーしか見ないものなので日本語で記載しています。
【おまけ】Proposalの書き方の参考リンク
hsbtさんのエントリが参考になります。
あとはググると実際に採択されたProposalがいくつか見つかるのでそれを読むのもいいです。
【宣伝】Music Event SponsorとしてRubyMusicMixin 2023を開催します
ピクシブは音楽中心懇親会 RubyMusicMixin 2023 を5月13日(土)の夜に開催します。スピーカーのsue445も参加予定ですので、発表を聞いてより詳しく話を聞いてみたい!と思った方はぜひお越しください。
日時: 2023年5月13日(土)20:00 - 26:00
場所: Bar & Lounge GNU
住所: 長野県松本市 深志 1-2-15 センチュリーマキシムビル 4階
- 参加登録は不要です
- RubyKaigi 2023 の名札をお持ちください。入場時にチェックを行います
- 入場料は無料です。フード、ドリンク代は別にかかります。ドリンク無料チケットを入場時に配布予定です