Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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