Slide 1

Slide 1 text

O/Rマッパーの光と闇
 2024/01/19 平尾一斗


Slide 2

Slide 2 text

❏ 名前
 ❏ 平尾 一斗(ひらお かずと)
 ❏ 主戦場
 ❏ 自社Webサービス開発
 ❏ 最近の関心事
 ❏ 結婚式の詳細見積もり書
 自己紹介 @kazuhira_0001

Slide 3

Slide 3 text

アジェンダ 起: この機能、動かないです!
 承: ボトルネックを探せ
 転: SQLをしゃべる
 結: O/Rマッパーは友達
 @kazuhira_0001

Slide 4

Slide 4 text

この機能、動かないです!
 鳴り響くアラートと共に、その問い合わせはやってきました @kazuhira_0001
 事業部 保証情報のCSV出力機能が動かない…


Slide 5

Slide 5 text

この機能、動かないです!
 @kazuhira_0001
 事業部 以前は動いていたんですけど
 最近重いなと感じてました


Slide 6

Slide 6 text

この機能、動かないです!
 「CSV出力機能」はどんな仕様なのか?
 @kazuhira_0001


Slide 7

Slide 7 text

この機能、動かないです!
 ビジネスにおける取引を全て記録する大きなテーブルを想定し、
 1. 取引の情報
 2. 取引に紐づく会社Aの統計(いろんな履歴から作る)
 3. 取引に紐づく会社Bの統計(いろんな履歴から作る)
 を全取引についてまとめてCSV化する
 ※「保証」とはなにかについては簡単のため一旦無視します
 @kazuhira_0001


Slide 8

Slide 8 text

この機能、動かないです!
 ビジネスにおける取引を全て記録する大きなテーブルを想定し、 1. 取引の情報 2. 取引に紐づく会社Aの統計(いろんな履歴から作る) 3. 取引に紐づく会社Bの統計(いろんな履歴から作る) を全取引についてまとめてCSV化する ※「保証」とはなにかについては簡単のため一旦無視します
 CSV1行あたりの導出のために
 多くのテーブルを参照しなければならない!
 @kazuhira_0001


Slide 9

Slide 9 text

この機能、動かないです!
 クエリが返ってきていない!!
 メモリ使用率がスパイクしてる!!
 
 うーん対応優先度低いけど機能不全はほっとけないなぁ。大きなデータ引っ張ってきてい るみたいけどチューニングとか業務仕様の整理とかめんどk(ry 
 
 直そう
 @kazuhira_0001


Slide 10

Slide 10 text

この機能、動かないです!
 そもそも業務を見直せ!というのは一旦置いて…
 @kazuhira_0001


Slide 11

Slide 11 text

ボトルネックを探せ ➔ クエリが返ってきていない!!
 ◆ クエリいっぱいある?
 ◆ 実行計画は?
 ➔ メモリ使用率がスパイクしてる!!
 ◆ 引っ張りたいデータが大きくて、オブジェクト化してる?
 @kazuhira_0001


Slide 12

Slide 12 text

ボトルネックを探せ(掘り下げる)
 ➔ クエリいっぱいある?
 ◆ テーブルごとに1回だけ取得していてN+1問題ではない
 ● が、後述のフルスキャンの一因である
 ➔ 実行計画は?
 ◆ インデックスが使われておらずフルスキャン
 ➔ 引っ張りたいデータが大きくて、オブジェクト化してる?
 ◆ フェッチしたデータで使わないデータがたくさん
 ● 本来出力するデータは100MB未満と試算
 @kazuhira_0001


Slide 13

Slide 13 text

ボトルネックを探せ(掘り下げる)
 ➔ 「インデックスが使われておらずフルスキャン」なのはなぜか?
 ◆ IN句が巨大になりrange_optimizer_max_mem_size(MySQL)の上限突破 
 ● リレーションをたどって外部キーで絞ろうとしてしていた 
 ➔ 「フェッチしたデータで使わないデータがたくさん」なのはなぜか?
 ◆ 大量のデータをオブジェクトにマッピングしてから整形している 
 @kazuhira_0001


Slide 14

Slide 14 text

SQLをしゃべる クエリの実行計画に気を付けつつ、
 必要なテーブル毎にデータを絞って抽出して集計したい
 O/Rマッパーで書くとすごく複雑になりそうだなぁ…
 SQLを直接話せばいいじゃない
 @kazuhira_0001


Slide 15

Slide 15 text

SQLをしゃべる がんばってクエリを書く…
 @kazuhira_0001


Slide 16

Slide 16 text

SQLをしゃべる ❏ 結果(全件指定)
 ❏ 【Before】
 ❏ タイムアウト
 ❏ 31クエリ(内、28クエリがフルスキャン)
 ❏ 【After】
 ❏ 10秒以内
 ❏ 1クエリ(急造のためフルスキャン一部あり)
 @kazuhira_0001


Slide 17

Slide 17 text

SQLをしゃべる 
 複雑なクエリが必要な場面では、
 がんばってクエリを書いたほうが近道なこともある
 @kazuhira_0001


Slide 18

Slide 18 text

O/Rマッパーは友達
 とはいえO/Rマッパーは人類が楽をしたいから作られたはず。
 @kazuhira_0001


Slide 19

Slide 19 text

【SQL】 1. クエリを書く 2. クエリを投げる a. 必要なら値のバインドも 3. 返ってきたデータを オブジェクトにマッピングする 4. 完了 【ActiveRecord】 1. モデルのメソッド呼ぶ 2. 完了 O/Rマッパーは友達
 単純なデータをオブジェクト化する実装が早い(例:Rails)
 @kazuhira_0001


Slide 20

Slide 20 text

O/Rマッパーは友達
 O/Rマッパーの特性を理解して使おう
 @kazuhira_0001