Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
O/Rマッパーの光と闇
Search
kazzhira
January 19, 2024
Technology
610
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
150
開発量を増やす
kazzhira
1
200
若手による若手のための 挑戦と失敗と再挑戦のリレー
kazzhira
1
200
エンジニアを選んだあなたへ.pdf
kazzhira
1
180
2024年の抱負
kazzhira
0
210
テストを並列実行してよかった話
kazzhira
0
160
Other Decks in Technology
See All in Technology
Optunaの最新リリースv5.0について
pfn
PRO
0
120
How to Design Configuration for Rails Applications
willnet
1
820
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
150
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
640
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
190
しろおびから始める!ログ活用の第一歩
shumei_ito
0
950
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
480
DBについての基礎説明(MySQL編) - コロプラ 2026年度 新卒研修
colopl
0
110
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
190
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
1
350
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
130
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
Bash Introduction
62gerente
615
220k
A Soul's Torment
seathinner
8
3.8k
Mind Mapping
helmedeiros
1
400
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
For a Future-Friendly Web
brad_frost
184
10k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
The SEO Collaboration Effect
kristinabergwall1
1
590
WCS-LA-2024
lcolladotor
0
890
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