そーくのつれづれぶろぐ

web系エンジニアの勉強したことなど

バッチ処理の設計観点まとめ

経緯

  • バッチ処理の設計をアサインされたが、観点漏れを起こしそうなのでまとめて見返すことができるようにと1枚ペラにまとめる

f:id:soachr:20200506221036j:plain
バッチ処理の設計観点まとめ

参考URL

【読書メモ】博報堂スピーチライターが教える 5日間で言葉が「思いつかない」「まとまらない」「伝わらない」がなくなる本

本書はタイトルですべてまとめられている。
(全体の構成がMECEになっているし、PREPにきれいにかかれているから頭にすっと入る...)

www.amazon.co.jp

タイトルの状態になるために、1~5ステップに分けてトレーニングを紹介している。

  1. 頭の中にあるものを知る
  2. 考える習慣をつける
  3. 論理的に発想する力をつける
  4. 真に伝わる表現力を磨く
  5. 言葉に説得力を持たせる

他の思考法の本だと3.あたりからの説明が多いが、それ以前の「自分が思っていることを言語化する」ことに
対しての具体的なトレーニングが記載されているのがありがたい。

「頭が真っ白になってすぐに言葉が出てこない」という人へ

この状態の人は本書を読む意味がありそう。

【読書メモ】マンガでわかる 必ず伝わる!ロジカル会話術

ロジカル・ダイアローグ(論理的に会話をする)方法について具体例とともに紹介している本。

https://www.amazon.co.jp/dp/B07GKW8MLV/r

ロジカル・ダイアローグ = 論理的に考える → 筋道立てて伝える 論理的に考える = 課題・問題を分ける → 分けたものを構造化する ⇛ 課題・問題を理解できる ⇛ 対策・改善ポイントを導きだせる

                           課題・問題を分けるときはMECE(もれなく・だぶりなく)を意識するとよい

筋道立てて伝える = 構造化した課題・問題に対して取捨選択をし、順序を導く → 相手の状況を考えつつ内容を伝える

                           話し方の順序は状況に応じて
                              相談・提案など ... PREP
                              お願い ... 起承転結

【読書メモ】世界一やさしい「思考法」の本 「考える2人」の物語

https://www.amazon.co.jp/dp/B00TFAFIC6/

戦略的=論理的=目的+(手段A+手段B...)
人に順序立てて明確に説明できなければすでに戦略的でない、というサイン

「目的に対してなにを考えればいいかわからない」場合にすること

  1. 「目的」を確認する
    • そもそも「目的」は正しいのか?疑う
      • もっと上位の目的はなにか、それを達成するためにふさわしい細分化した目的になっているか
  2. 「目的」からすべきこと「イシュー」をリスト化する
  3. イシューリストのアイテムを階層化・グルーピングする(=イシューツリー)
  4. 優先順位をつけて整理する

https://www.amazon.co.jp/dp/B00TFAFIC6/

所感

振り返ると過去に読んだ内容だけれども、身についてるかというと全然身についていないことを理解できた。
最近うまく説明できなかったり手戻りが目立つため改めて本を読んでみたが、基礎の部分がなっていないと反省...。目的は理解してないわ、イシューリストをMECEに分けられてないわ...時間は迫るわで余計に基礎がおろそかに...確実に習慣に落とし込む。

【PostgreSQL】やっぱり実行計画を読めるようになりたい!3つのおさらいポイント

はじめに

この記事は「ラクス Advent Calendar 2019」の11日目の投稿です。
昨日は@FlatMountainさんのJavaでArduinoを動かしてみた!でした。Arduino楽しそう...

いきなりですが、今年の3月に弊社技術ブログにて以下の記事を投稿しました。(id違いますが同一人物です)。まえがきを以下のように書いていました。

tech-blog.rakus.co.jp

...実行計画を読み解く記事を書こう!...と思いたったのですが、記事を書くにあたって ...(中略)...備忘も込めて当初予定していた記事を書く前に大量データの投入について述べたいと思います。

見逃してはいけない部分は "備忘も込めて当初予定していた記事を書く前に" ですね。

そうです、当初予定していた実行計画を読み解く記事を書く書く詐欺をして12月を迎えてしまったわけです。これは書かねばならぬと思いアドベントカレンダーの枠で投稿しようと決意しました。

私の経験ですが、入門記事や動画を見て「実行計画完全に理解した」みたいな気持ちで実務で実行計画を出してみた瞬間、己の無力さを噛み締め天を仰ぎました。 実務のSQLの実行計画を見ながら手探りでネットで検索しながら実行計画を見直し...を繰り返しようやくまあまあ読めるようになった、と今は思います。

この記事ではそんな私が振り返ってみて感じた実行計画を読むにあたって押さえるべきポイント3つを紹介したいと思います。

実行計画を読むポイント

  1. 実行計画のネストに注目する
  2. ノードがSQL文のどの句にあたるかを覚える&処理の内容を理解する
  3. 実行計画からSQLとリンクするキーワードを探す

実行計画を読む目的の多くは「パフォーマンス劣化を改善する」かと思います。なのでまずはパフォーマンス劣化している箇所を特定する必要があります。が、特定ができない...特定ができない原因はSQLと実行計画の対応付けができていないことではないでしょうか。この3つのポイントを押さえれば最終的に実行計画のどの行がSQLのどの句にあたるのかがわかる→パフォーマンス劣化を引き起こす箇所の特定ができるのではと考えています。

1. 実行計画のネストに注目する

入門記事ではだいたい書いてある気がしますが、あえてポイントとして挙げています。複雑な実行計画になればなるほどノードとSQLの対応付けが難しいです。30行くらいになるとひとつひとつ虱潰しに...となると心が折れそうになります。ですが、ネストの同じ階層を見ていくとだいたいサブクエリなどのひとかたまりの処理になっていますので、まずはネストを見ることでざっくりSQLのサブクエリや結合テーブルが実行計画のどのあたりに出現するのかを把握することができ、原因箇所の特定がしやすくなります。

2. ノードがSQL文のどの句にあたるかを覚える&処理の内容を理解する

これはかなり重要です。覚えておかないとそもそもどの処理をやっているのか全くわからないので英単語と一緒で最低限は知っておく必要があります。
ノードはかなりの種類があるのですが、SQLの処理からノードを対応付けて覚えると覚えることが少なく済むと思います。 実行計画をSQLに落とし込むことで初めてチューニングができるので、細かいノードの意味よりは先にSQLでいうとどこに当たるか?というところに目を向けるとよいでしょう。

SQLでやっている処理はたいてい「①結合して、②欲しい情報を探索して、③データを演算して、④ソートする」の4種類くらいで、次の表からわかるようにそれぞれ複数のノード(=処理方法)が存在しています。

処理 SQL 代表的なノード名
①結合処理 JOIN Nested Loop Join/Hash Join/Marge Join
②探索処理 WHERE/結合処理過程で内部的に実施など Index Scan/Seq Scan/Index Only Scan
③演算処理 GROUP BY/SUM/LIMITなど Aggregate/Hash Aggregate/Limit
④ソート処理 ORDER BY/結合処理過程で内部的に実施など Sort

ノードによっては別のノードを必ず呼び出すものもあるため、各ノードがどのような処理をしているのかを頭にいれておくことで、想定外のノードが出現する理由がわかるようになります。 SQLがどのように実行されているかを理解することで、パフォーマンス劣化の原因特定に1歩近づくでしょう。

3. 実行計画からSQLとリンクするキーワードを探す

WHERE句やON句などにでてくるカラム名やテーブル名は実行計画に書かれるため、ポイント1,2でアタリをつけたあと、詳細にSQLとの対応関係を把握するには、SQLにあるカラム名やテーブル名を探すことが有効です。また、テーブルやカラムにエイリアスをつけていると実行計画にもそのエイリアスが出現するので検索しやすく、原因特定の助けになります。

最後に

本当はケーススタディ式に簡単なSQLの実行計画を上述のポイントをおさえながら読み解くところまで書こうと思っていたのですが...。(そして更に難しいSQLで読み解くところも書こうと思っていたのですが...)

...ケーススタディ編は今年度中に書き上げてアップしたいと思います。読んでいただきありがとうございます!本日も皆さんにとって良い一日になりますように!