Tag: PostgreSQL
-
PostgreSQLのWALを対話的に読むTUIツール(pg_walview)を作ってみた
PostgreSQLのWALファイルを対話的に読むためのTUIツール pg_walview を作りました。 同じXIDのレコードをグラフ線で繋いで表示するので、絞り込まずに特定のトランザクションを 目で追えます。画面の構成と使い方を紹... -
論理レプリケーションでのレプリケーションラグの原因を調べてみた
PostgreSQLの論理レプリケーションでレプリケーションラグが大きくなる原因を調べました。synchronous_commitを変えながら物理レプリケーションと比較し、サブスクライバがデフォルトで非同期コミットを使う点に行き着きます。 -
UUIDの生成速度を上げる取り組み
PostgreSQLのUUIDv7の生成速度を上げるための改善について、その背景と検証内容を紹介します。C実装のuuidv7()とRust(pgrx)実装の性能を比較し、どこがボトルネックになっているかを掘り下げます。 -
PostgreSQL 18がUUIDv7をサポート
PostgreSQL 18がRFC 9562のUUIDv7をサポートしました。タイムスタンプを先頭に持つためソート可能というUUIDv7の特徴と、uuidv7()関数の使い方、UUIDv4との違いを実際のSQLで比較しながら解説します。 -
PostgreSQL 17で新しく実装されたradix treeを使ってインメモリのキーバリューストア作ってみた
PostgreSQL 17で新しく実装されたradix tree(radixtree.h)を使って、インメモリのキーバリューストア拡張 pg_memstore を作ってみました。Vacuumの高速化を支えたradix treeの使い方... -
PostgreSQLでmusl libcを使う方法
標準Cライブラリにglibcではなくmusl libcを使ってPostgreSQLをビルドする方法のメモです。musl libcの準備からconfigureのオプション指定、ビルド時にはまった点までを紹介します。 -
PostgreSQLで「圧縮+読み取り専用テーブル」をテーブルAMを使って自作してみた
PostgreSQLのTable Access Method(Table AM)を使って、圧縮された読み取り専用テーブルを追加する拡張機能 pgroad を自作しました。Table AMのコールバック実装と、アーカイブ用途での使い方を... -
PostgreSQLでトランザクションIDをできるだけ早く消費する方法
PostgreSQLのトランザクションID(XID)をできるだけ早く消費する方法をいくつか紹介します。XID周回とaggressive vacuumのテストのために、約20億トランザクションを現実的な時間で消費するための手法を比較します。 -
PostgreSQLで(わかりづらい)bannerプログラム作ってみた
PostgreSQLのテーブルファイルをバイナリで覗くと文字列が浮かび上がる、という(わかりづらい)bannerプログラムを作ってみました。ページレイアウトとタプルの物理配置を利用した実装を解説します。 -
ALTER TABLEの各コマンドのロックレベル
ALTER TABLEの各サブコマンドが取得するテーブルロックのレベルを一覧にまとめました。PostgreSQL 15のソースコード(tablecmds.c)ベースで、AccessExclusiveLockを取るコマンドとそうでないコ... -
ストリーミングレプリケーションプロトロルで遊ぶ
PostgreSQLの物理レプリケーションと論理レプリケーションが共通で使うストリーミングレプリケーションプロトコルを、実際に手で喋って動かしてみます。レプリケーション接続の確立からWALの受信までの流れを解説します。 -
PostgreSQLの色んなINSERTの仕方
PostgreSQLでデータを投入する色々な方法を比較します。単純なINSERT、複数VALUES、PREPARE、COPY、pg_bulkloadなどの書き方と、それぞれの性能差を実測して整理します。 -
最速でVacuumを完了させる方法とその副作用
XID周回問題に追われてVacuumを最速で完了させたいときに使えるパラメータ設定と、その副作用を解説します。vacuum_cost_delayやmaintenance_work_memの調整が何を犠牲にするのかを整理します。 -
PostgreSQLのMVCCとガベージコレクション(Vacuum)
PostgreSQLのMVCC(多版型同時実行制御)の仕組みと、不要になった行をVacuumがどう回収するかを解説します。トランザクションID、xmin/xmax、可視性判定、そしてガベージコレクションとしてのVacuumの役割を順に... -
PostgreSQL 14でのBtreeインデックスのVacuum関連の改善についての解説
PostgreSQL 14で行われたBtreeインデックスのVacuum関連の3つの改善を解説します。index cleanupでのインデックスフルスキャンがどのような条件で走っていたのか、そしてそれがどう削減されたかを説明します。 -
MyProc->delayChkptについての理解と覚書
PostgreSQLのソースコードに出てくるMyProc->delayChkptが何のためにあるのかを解説します。コミットのWAL書き込みとpg_xactの更新の間でチェックポイントを遅延させる必要がある理由を、クラッシュリカバリの観... -
今年はPostgreSQL開発に参画してみたいという人のためにレビューしやすいパッチを選びました
PostgreSQLの開発に参加してみたい人向けに、Commitfestに登録されたパッチの中からレビューしやすいものを選んで紹介します。Commit Fest Managerとして全パッチを確認した上でのリストです。 -
シーケンシャル・スキャンだからといってデータがテーブルの先頭から返ってくるとは限らない、という話
PostgreSQLのシーケンシャルスキャン(Seq Scan)は、必ずしもテーブルの先頭から行を返すとは限りません。synchronize_seqscansによる同期スキャンの挙動を、実際に手を動かして確認します。 -
PostgreSQLのソースコードの構造
PostgreSQLのソースコードのディレクトリ構成と、どこから読み始めればよいかを解説します。src/backend以下の各ディレクトリが何を担当しているかを整理しており、ソースコードリーディングの入口として使えます。 -
BRINソースコードリーディング(構築)
PostgreSQLのBRINインデックスのソースコードのうち、CREATE INDEXでの構築処理を読んだメモです。BrinBuildState構造体を起点に、レンジごとのサマリがどう作られていくかを追いかけます。 -
BRINの概要
PostgreSQLのBRIN(Block Range INdex)の概要をまとめます。ブロックレンジごとに最小値・最大値を保持するというインデックス構造、Btreeとのサイズ差、データの物理的な並び順に性能が依存する理由を解説します。 -
VACUUMのログの読み方(VACUUM VERBOSE)
PostgreSQLのVACUUM VERBOSEが出力するログの読み方を、Scan/Vacuum index/Vacuum tableの3フェーズに分けて項目ごとに解説します。log_autovacuum_min_durationで... -
OS Xで開発中のコードに対してpgindentを実行する
PostgreSQLの拡張機能や開発中のコードに対してmacOS(OS X)でpgindentを実行する方法のメモです。LLVMではデバッグ情報が実行ファイルと別になるため、typedefリストの作り方に一工夫が必要です。 -
FDWを使った時の読取り異常、更新異常を見てみる
PostgreSQLのpostgres_fdwは分散トランザクションに対応していないため、複数の外部サーバをまたぐと読取り異常や更新異常が発生します。実際にクラスタを組んで、どのような異常が起きるのかを再現して確認します。 -
PostgreSQLのリカバリ周りのバグを修正してみた - 原因究明編 -
PostgreSQLのリカバリ周りのバグ修正の原因究明編です。RECOVERYHISTORYファイルがなぜ残るのか、KeepFileRestoredFromArchive関数とexitArchiveRecovery関数を追いながら仮説... -
リリースノートからコミットログを調べる
PostgreSQLのリリースノートの各項目から、対応するコミットログを探す方法を紹介します。リリースノートのソースであるSGMLファイルを使うことで、機能の詳細を効率よく追跡できます。 -
PostgreSQLのリカバリ周りのバグを修正してみた - 問題発見編 -
PostgreSQLのリカバリ機能にあったバグを、発見から原因特定、修正まで実際に行った過程を紹介します。問題発見編では、タイムラインIDの検証中にRECOVERYHISTORYファイルの残留を見つけるまでを扱います。 -
ロジカルレプリケーションのレプリケーション衝突を解決する
PostgreSQLの論理レプリケーションでレプリケーション衝突が発生すると、手動で回避するまで反映が止まります。pg_replication_origin_advance()を使ったスキップの問題点と、より安全な衝突の解決方法を検証... -
SQLからHINT句を生成するツール(phint)を作ってみた
SQLを実行して、その実行計画を再現するためのpg_hint_plan用のHINT句を生成するツール phint をGo言語で作りました。インストール方法から実際の使い方までを紹介します。 -
PostgreSQLは20年間どのようにfsyncを間違って使っていたか - 聴講メモ -
PostgreSQLで修正されたfsync周りのバグ修正について解説された動画の聴講メモ。 -
Parallel Queryの概要
PostgreSQLのパラレルクエリ(Parallel Query)について、その概要、実行計画(EXPLAIN)の読み方などを解説 -
Window関数のFILTER句を極める
Window関数のFILTERオプションについて、その機能、WHERE句との違い等を徹底解説。 -
トランザクションIDへのロックと行ロック
トランザクションIDへのロックと行ロックの関係について解説します -
Window関数のフレームを極める(EXCLUDEオプション編)
Window関数のフレームのEXCLUDEオプションを徹底解説 -
Window関数のフレームを極める
Window関数のフレームを徹底解説 -
Window関数と集約関数
Window関数と集約関数について解説 -
Window関数の基本
Window関数の基本を解説 -
PostgreSQL 11で導入されたVacuumの2つの改善
PostgreSQL 11で導入されたVacuumの改善のうち、Vacuum実行中のFree Space Map(FSM)更新と、もう1つの改善について解説します。Vacuumの長時間化やキャンセル時にテーブルが肥大化していた問題がど... -
SoftwareDesign 5月号に寄稿させていただきました
SoftwareDesign 2018年5月号の第3章「MySQLとPostgreSQL比較」を執筆させていただきました。寄稿の経緯と記事の内容について紹介します。 -
コミットログからPostgreSQL 11の雰囲気を掴む
PostgreSQL 11のコミットログを追いかけて、次期メジャーバージョンにどんな機能が入るのかを俯瞰します。リリースノートが出る前にコミットログから新機能の傾向を掴む方法も紹介します。 -
DaaSでサポートされているPostgreSQLの拡張機能をまとめてみた
DaaSでサポートされているPostgreSQLの拡張機能(EXTENSION)のまとめ -
BDI勉強会で話してきました
BDI勉強会で「Vacuumとzheap」というタイトルで発表してきました。現在のVacuumの課題点と改善案、およびPostgreSQLコミュニティに提案されているストレージエンジン機能とzheapについて話した内容のまとめです。 -
よく使うpsqlの便利技10選
よく使うpsqlの便利技10選 -
Replication Originとは
PostgreSQLの論理レプリケーションで使われるReplication Origin(レプリケーション起点)とは何かを解説します。レプリケーション進捗の追跡と、双方向レプリケーションでの変更のループ防止という2つの目的を、具体的な...