$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
O/Rマッパーの光と闇
Search
kazuhira
January 19, 2024
Technology
0
530
O/Rマッパーの光と闇
若手・学生サーバーサイドエンジニアLT会で発表した内容です
kazuhira
January 19, 2024
Tweet
Share
More Decks by kazuhira
See All by kazuhira
楽しいアジャイル開発のための_現場のスクラムの話をしよう.pdf
kazutocode
0
120
開発量を増やす
kazutocode
1
160
若手による若手のための 挑戦と失敗と再挑戦のリレー
kazutocode
1
170
エンジニアを選んだあなたへ.pdf
kazutocode
1
150
2024年の抱負
kazutocode
0
170
テストを並列実行してよかった話
kazutocode
0
140
Other Decks in Technology
See All in Technology
フィッシュボウルのやり方 / How to do a fishbowl
pauli
2
390
AI駆動開発の実践とその未来
eltociear
2
490
「もしもデータ基盤開発で『強くてニューゲーム』ができたなら今の僕はどんなデータ基盤を作っただろう」
aeonpeople
0
250
会社紹介資料 / Sansan Company Profile
sansan33
PRO
11
390k
[Data & AI Summit '25 Fall] AIでデータ活用を進化させる!Google Cloudで作るデータ活用の未来
kirimaru
0
3.9k
Oracle Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
2
200
Next.js 16の新機能 Cache Components について
sutetotanuki
0
190
通勤手当申請チェックエージェント開発のリアル
whisaiyo
3
470
なぜ あなたはそんなに re:Invent に行くのか?
miu_crescent
PRO
0
210
マイクロサービスへの5年間 ぶっちゃけ何をしてどうなったか
joker1007
21
8.1k
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
210
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
1
770
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
230
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
2
66
Highjacked: Video Game Concept Design
rkendrick25
PRO
0
250
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Mobile First: as difficult as doing things right
swwweet
225
10k
For a Future-Friendly Web
brad_frost
180
10k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
750
A Modern Web Designer's Workflow
chriscoyier
698
190k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
92
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
0
45
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