#データベース
28 件の記事
PostgreSQL 実践講座 #7 パーティショニング — 巨大テーブルを時間の単位で分ける
数億行テーブルの標準処方である宣言的パーティショニングを扱います。パーティショニングが実際に解決する問題(古いデータの削除が DROP 一発・パーティションプルーニング・VACUUM 負担の分散)と解決しない問題、RANGE パーティショニングで月別テーブルを作る文法、パーティションキーが PK に含まれる必要がある制約、プルーニングが効くクエリ条件の条件、新しいパーティションを作り続ける運用負担と pg_partman、そして「いつ導入するか」の判断基準まで扱います。
PostgreSQL 実践講座 #6 ロックと同時実行 — デッドロック、DDL ロック、SKIP LOCKED
MVCC が解決してくれない領域、ロックを扱います。行ロック(書き込み同士の衝突)とテーブルロック(DDL)の 2 つの層、ロック待ちを pg_locks と pg_blocking_pids で追跡する方法、デッドロックが起きる構造(交差した順序の更新)と予防ルール(同じ順序で取る)、SELECT FOR UPDATE で読んで-判断して-書くを安全にする方法、そして作業キューの標準パターン FOR UPDATE SKIP LOCKED まで扱います。
PostgreSQL 実践講座 #5 VACUUM と autovacuum — dead tuple 掃除の原理とチューニング
PostgreSQL 運用知識の中心である VACUUM を扱います。MVCC が残す dead tuple と VACUUM がする仕事(空間の再利用マーク・可視性マップの更新・トランザクション ID 周回の防止)、普段は autovacuum に任せればいい理由と既定のしきい値の限界(大きいテーブルほど掃除が遅れる)、テーブル単位のスケールファクタ調整、掃除を妨げる長時間トランザクション、肥大化の確認クエリ、そして VACUUM FULL の危険性まで扱います。
PostgreSQL 実践講座 #4 インデックス戦略の応用 — 部分・複合・カバリング、そして GIN・BRIN
基礎第 4 回の B-tree の基本の上に実戦の戦略を積みます。WHERE 条件までインデックスに入れる部分インデックス、テーブルアクセスを省略するカバリングインデックス(INCLUDE)と Index Only Scan の条件、B-tree 以外の選択肢(GIN・GiST・BRIN)を選ぶ基準、使われていないインデックスを pg_stat_user_indexes で見つけて整理する方法、インデックスの肥大化と REINDEX CONCURRENTLY まで扱います。
PostgreSQL 実践講座 #3 性能診断のルーチン — pg_stat_statements で遅いクエリを見つける
「DB が遅い」から犯人のクエリまで辿り着く標準ルーチンを作ります。いま何が起きているかを見る pg_stat_activity(アクティブなクエリ・待ち・長引くトランザクション)、累積統計で高くつくクエリを見つける pg_stat_statements の導入と主要カラム(total_exec_time・mean_exec_time・calls)、合計上位と平均上位が指す別々の犯人、スロークエリログ(log_min_duration_statement)の設定、そして EXPLAIN への受け渡しまで扱います。
PostgreSQL 実践講座 #2 コネクションプール — max_connections の誤解と PgBouncer
トラフィックが増えると必ずぶつかるコネクション問題を扱います。PostgreSQL のコネクションがプロセス 1 つで高くつく理由、max_connections を上げるのが答えではない理由(多すぎるコネクションはむしろスループットを下げます)、アプリケーションのプールと PgBouncer のような外部プーラーの役割分担、PgBouncer transaction モードの効果と制約(セッション状態の機能が使えない)、そして適正なプールサイズの感覚まで扱います。
PostgreSQL 実践講座 #1 スキーマ・マイグレーション — サービスを止めずにテーブルを変える
実践編の始まりは、稼働中のテーブルを変える技術です。マイグレーションをコードで管理すべき理由(順序・再現性)、DDL もトランザクションになる PostgreSQL の強み、ロックを長く握る危険な変更と安全な変更の区別、NOT NULL の追加を段階に分ける方法、CREATE INDEX CONCURRENTLY、そしてカラム名の変更・型変更を拡張-移行-縮小(expand-contract)で解く戦略まで扱います。
PostgreSQL 基礎講座 #9 ロール・権限・バックアップ基礎 — 運用の最小規律
基礎講座の締めくくりとして運用の最小規律を固めます。ロール(role)1 つでユーザーとグループを統一した PostgreSQL の権限モデル、アプリケーションに superuser を渡さず最小権限アカウントを作る実務の手順(GRANT とデフォルト権限)、public スキーマの注意点、pg_dump・pg_restore による論理バックアップと復元リハーサルの重要性、そして基礎 9 回の振り返りと実践編の予告まで扱います。
PostgreSQL 基礎講座 #8 ビュー・CTE・ウィンドウ関数 — 複雑なクエリを読みやすくする
大きくなったクエリを構造化する 3 つの道具を固めます。繰り返されるクエリに名前を付けるビューと物理コピーであるマテリアライズドビューの区別、WITH 句(CTE)でクエリを段階ごとに記述する方法、ウィンドウ関数の基本構造(OVER、PARTITION BY)と ROW_NUMBER でグループごとの上位 N 件を取る代表パターン、集計関数とウィンドウ関数の違い(行が減らない)、LAG で前月比を求める例まで扱います。
SQLAlchemy 2.0 #7 Alembic と実戦構成 — マイグレーション、非同期、チーム規約
シリーズ最終回として運用フェーズのテーマを整理します。create_all がスキーマ変更を解決できない理由と Alembic の導入、autogenerate が検知できるものと見落とすもの、マイグレーションファイルのレビュー原則、create_async_engine と AsyncSession に移行する非同期構成と遅延ロードの制約、モデル・セッション・設定を配置するプロジェクト構造、チームで守る規約まで扱います。
PostgreSQL 基礎講座 #7 JSONB — スキーマの柔軟さをリレーショナルの中で
PostgreSQL が NoSQL の領域まで担えるようになった立役者、JSONB を固めます。json と jsonb の違い(jsonb が既定値である理由)、値の取り出し演算子(->、->>、#>>)と存在・包含演算子(?、@>)の使い方、JSONB 検索を支える GIN インデックス、更新(jsonb_set)の特性、そして一番重要な「どこまでをカラムにして、どこからを JSONB に入れるか」の設計境界まで扱います。
SQLAlchemy 2.0 #6 クエリ応用 — 結合、集計、サブクエリ、大量処理
select() ひとつで実戦的なクエリを組み立てる方法を整理します。scalars と execute の戻り値の形の違い、複数条件と or_、結合と明示的な ON 句、group_by と集計関数にラベルを付けて読む方法、サブクエリと EXISTS、LIMIT・OFFSET ページネーションとその限界、ORM の単位作業を迂回する大量 INSERT・UPDATE まで、2.0 スタイルのクエリの実務レパートリーを扱います。