Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
O/Rマッパーの光と闇
Search
kazzhira
January 19, 2024
Technology
590
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
O/Rマッパーの光と闇
若手・学生サーバーサイドエンジニアLT会で発表した内容です
kazzhira
January 19, 2024
More Decks by kazzhira
See All by kazzhira
楽しいアジャイル開発のための_現場のスクラムの話をしよう.pdf
kazzhira
0
140
開発量を増やす
kazzhira
1
180
若手による若手のための 挑戦と失敗と再挑戦のリレー
kazzhira
1
180
エンジニアを選んだあなたへ.pdf
kazzhira
1
170
2024年の抱負
kazzhira
0
190
テストを並列実行してよかった話
kazzhira
0
150
Other Decks in Technology
See All in Technology
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
520
伝票作成AIエージェントを支える、LLMOpsとインフラの選択肢 / AICon2026_takeda
rakus_dev
0
300
Multicaで30個のミニプロジェクトをAIエージェント運用して見えてきたこと
eiei114
1
660
コンテナ・K8s研修【MIXI 26新卒技術研修】#2
mixi_engineers
PRO
1
190
システム監視入門
grimoh
2
570
Vポイント分析基盤におけるデータモデリング20年史
taromatsui_cccmkhd
4
770
人とエージェントが高め合う協業設計
kintotechdev
0
940
AI工学特論: MLOps・継続的評価
asei
10
2.6k
現場との対話から始める “作る前に問い直す”業務改善
mochico50
2
310
AWS環境のセキュリティ不安を解消した企業事例 ~よくある課題と対策を一挙公開~
asanoharuki
0
190
Flutter研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
140
AIエージェントがあれば技術書なんてすぐ書けるでしょ→無理でした
watany
4
480
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
ラッコキーワード サービス紹介資料
rakko
1
4M
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
Speed Design
sergeychernyshev
33
1.9k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
Building Adaptive Systems
keathley
44
3.1k
We Have a Design System, Now What?
morganepeng
55
8.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
610
Transcript
O/Rマッパーの光と闇 2024/01/19 平尾一斗
❏ 名前 ❏ 平尾 一斗(ひらお かずと) ❏ 主戦場 ❏ 自社Webサービス開発 ❏ 最近の関心事
❏ 結婚式の詳細見積もり書 自己紹介 @kazuhira_0001
アジェンダ 起: この機能、動かないです! 承: ボトルネックを探せ 転: SQLをしゃべる 結: O/Rマッパーは友達 @kazuhira_0001
この機能、動かないです! 鳴り響くアラートと共に、その問い合わせはやってきました @kazuhira_0001 事業部 保証情報のCSV出力機能が動かない…
この機能、動かないです! @kazuhira_0001 事業部 以前は動いていたんですけど 最近重いなと感じてました
この機能、動かないです! 「CSV出力機能」はどんな仕様なのか? @kazuhira_0001
この機能、動かないです! ビジネスにおける取引を全て記録する大きなテーブルを想定し、 1. 取引の情報 2. 取引に紐づく会社Aの統計(いろんな履歴から作る) 3. 取引に紐づく会社Bの統計(いろんな履歴から作る) を全取引についてまとめてCSV化する ※「保証」とはなにかについては簡単のため一旦無視します
@kazuhira_0001
この機能、動かないです! ビジネスにおける取引を全て記録する大きなテーブルを想定し、 1. 取引の情報 2. 取引に紐づく会社Aの統計(いろんな履歴から作る) 3. 取引に紐づく会社Bの統計(いろんな履歴から作る) を全取引についてまとめてCSV化する ※「保証」とはなにかについては簡単のため一旦無視します
CSV1行あたりの導出のために 多くのテーブルを参照しなければならない! @kazuhira_0001
この機能、動かないです! クエリが返ってきていない!! メモリ使用率がスパイクしてる!! うーん対応優先度低いけど機能不全はほっとけないなぁ。大きなデータ引っ張ってきてい るみたいけどチューニングとか業務仕様の整理とかめんどk(ry 直そう @kazuhira_0001
この機能、動かないです! そもそも業務を見直せ!というのは一旦置いて… @kazuhira_0001
ボトルネックを探せ ➔ クエリが返ってきていない!! ◆ クエリいっぱいある? ◆ 実行計画は? ➔ メモリ使用率がスパイクしてる!! ◆
引っ張りたいデータが大きくて、オブジェクト化してる? @kazuhira_0001
ボトルネックを探せ(掘り下げる) ➔ クエリいっぱいある? ◆ テーブルごとに1回だけ取得していてN+1問題ではない • が、後述のフルスキャンの一因である ➔ 実行計画は? ◆
インデックスが使われておらずフルスキャン ➔ 引っ張りたいデータが大きくて、オブジェクト化してる? ◆ フェッチしたデータで使わないデータがたくさん • 本来出力するデータは100MB未満と試算 @kazuhira_0001
ボトルネックを探せ(掘り下げる) ➔ 「インデックスが使われておらずフルスキャン」なのはなぜか? ◆ IN句が巨大になりrange_optimizer_max_mem_size(MySQL)の上限突破 • リレーションをたどって外部キーで絞ろうとしてしていた ➔
「フェッチしたデータで使わないデータがたくさん」なのはなぜか? ◆ 大量のデータをオブジェクトにマッピングしてから整形している @kazuhira_0001
SQLをしゃべる クエリの実行計画に気を付けつつ、 必要なテーブル毎にデータを絞って抽出して集計したい O/Rマッパーで書くとすごく複雑になりそうだなぁ… SQLを直接話せばいいじゃない @kazuhira_0001
SQLをしゃべる がんばってクエリを書く… @kazuhira_0001
SQLをしゃべる ❏ 結果(全件指定) ❏ 【Before】 ❏ タイムアウト ❏ 31クエリ(内、28クエリがフルスキャン) ❏
【After】 ❏ 10秒以内 ❏ 1クエリ(急造のためフルスキャン一部あり) @kazuhira_0001
SQLをしゃべる 複雑なクエリが必要な場面では、 がんばってクエリを書いたほうが近道なこともある @kazuhira_0001
O/Rマッパーは友達 とはいえO/Rマッパーは人類が楽をしたいから作られたはず。 @kazuhira_0001
【SQL】 1. クエリを書く 2. クエリを投げる a. 必要なら値のバインドも 3. 返ってきたデータを オブジェクトにマッピングする
4. 完了 【ActiveRecord】 1. モデルのメソッド呼ぶ 2. 完了 O/Rマッパーは友達 単純なデータをオブジェクト化する実装が早い(例:Rails) @kazuhira_0001
O/Rマッパーは友達 O/Rマッパーの特性を理解して使おう @kazuhira_0001