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
460
O/Rマッパーの光と闇
若手・学生サーバーサイドエンジニアLT会で発表した内容です
kazuhira
January 19, 2024
Tweet
Share
More Decks by kazuhira
See All by kazuhira
楽しいアジャイル開発のための_現場のスクラムの話をしよう.pdf
kazutocode
0
66
開発量を増やす
kazutocode
1
140
若手による若手のための 挑戦と失敗と再挑戦のリレー
kazutocode
1
140
エンジニアを選んだあなたへ.pdf
kazutocode
1
140
2024年の抱負
kazutocode
0
150
テストを並列実行してよかった話
kazutocode
0
100
Other Decks in Technology
See All in Technology
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
2
570
CSPMとのつきあい方
nantokanare
0
100
DevinでAI AWSエンジニア製造計画 序章 〜CDKを添えて〜/devin-load-to-aws-engineer
tomoki10
0
230
"TEAM"を導入したら最高のエンジニア"Team"を実現できた / Deploying "TEAM" and Building the Best Engineering "Team"
yuj1osm
1
240
30→150人のエンジニア組織拡大に伴うアジャイル文化を醸成する役割と取り組みの変化
nagata03
0
380
Qiita Organizationを導入したら、アウトプッターが爆増して会社がちょっと有名になった件
minorun365
PRO
1
360
エンジニアの健康管理術 / Engineer Health Management Techniques
y_sone
8
4.1k
Amazon Aurora のバージョンアップ手法について
smt7174
2
190
Aurora PostgreSQLがCloudWatch Logsに 出力するログの課金を削減してみる #jawsdays2025
non97
1
250
人生を左右する「即答」のススメ: 一瞬の判断を間違えないためにするべきこと
takasyou
3
400
エンジニアのキャリアパスと、 その中で自分が大切にしていること
noteinc
3
740
Snowflake ML モデルを dbt データパイプラインに組み込む
estie
0
120
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
A Tale of Four Properties
chriscoyier
158
23k
Speed Design
sergeychernyshev
28
820
Mobile First: as difficult as doing things right
swwweet
223
9.5k
Embracing the Ebb and Flow
colly
84
4.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Git: the NoSQL Database
bkeepers
PRO
429
65k
Become a Pro
speakerdeck
PRO
26
5.2k
Optimizing for Happiness
mojombo
377
70k
Into the Great Unknown - MozCon
thekraken
35
1.7k
Documentation Writing (for coders)
carmenintech
69
4.6k
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