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
kazuhira
January 19, 2024
Technology
0
540
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
160
2024年の抱負
kazutocode
0
170
テストを並列実行してよかった話
kazutocode
0
140
Other Decks in Technology
See All in Technology
超初心者からでも大丈夫!オープンソース半導体の楽しみ方〜今こそ!オレオレチップをつくろう〜
keropiyo
0
120
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
3
1.6k
AI駆動開発を事業のコアに置く
tasukuonizawa
1
340
30万人の同時アクセスに耐えたい!新サービスの盤石なリリースを支える負荷試験 / SRE Kaigi 2026
genda
4
1.3k
M&A 後の統合をどう進めるか ─ ナレッジワーク × Poetics が実践した組織とシステムの融合
kworkdev
PRO
1
490
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
190
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
Agile Leadership Summit Keynote 2026
m_seki
1
660
[CV勉強会@関東 World Model 読み会] Orbis: Overcoming Challenges of Long-Horizon Prediction in Driving World Models (Mousakhan+, NeurIPS 2025)
abemii
0
150
ランサムウェア対策としてのpnpm導入のススメ
ishikawa_satoru
0
210
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
130
コンテナセキュリティの最新事情 ~ 2026年版 ~
kyohmizu
2
740
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
Music & Morning Musume
bryan
47
7.1k
Faster Mobile Websites
deanohume
310
31k
Bash Introduction
62gerente
615
210k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Marketing to machines
jonoalderson
1
4.6k
Designing for Timeless Needs
cassininazir
0
130
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
The Limits of Empathy - UXLibs8
cassininazir
1
220
Practical Orchestrator
shlominoach
191
11k
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