PostgreSQL

バッファ管理。バッファ、ブロック、ページ、アイテムの区別。

これまで区別があいまいだったデータ構造を整理してみた。 バッファ関連 BufferDesc バッファ記述子。共有バッファを構成する1フレーム。制御情報を持つ。Page(Block)を管理する。 Buffer BufferDescの識別子相当。1はじまり。BufferDescの配列のindexに使わ…

バッファ管理。タプルの追加。宿題への回答

きのうの宿題の回答 タプル追加のためにバッファを取得するロジックはどうなっている? いろんな条件があるけど、よくありそうなケースは開き領域があれば今のページ、なければ新しいページを取得。テーブルに空きを残すためのFILLFACTORが考慮されている。F…

oid2nameを使ってみた

OIDとオブジェクトの名前の相互変換に便利なツールがcontribにあることを知った。これまで、pg_classとかカタログを使ったSQLを使わないと変換できないと思ってた。これは便利。インストール $ cd /usr/local/src/postgresql-8.3.5/contrib/oid2name/ $ make…

サブトランザクション、マルチトランザクション、2相コミットって何?

チェックポイントの処理(CheckPointGuts())でSUBTRANS、MultiXact、TwoPhaseというような用語が出てくる。それぞれ、サブトランザクション、マルチトランザクション、2相コミットのことだと思うが、サブトランザクションとマルチトランザクションが何のこ…

リカバリ。WAL(Write Ahead Log)

WALとCLOG ここ2、3日、WALとCLOGのどちらへの書き込みが終わったらトランザクションの持続性が確保されるのか?と悩んでいた。 結論としては、WAL。WALへの書き込みはfdatasync()で同期書き込みされるけど、CLOGへの書き込みは非同期だから(チェックポイン…

バッファ管理。タプルの追加

シンプルなINSERTを行ったときの呼び出しシーケンス。ページにタプルを追加するところまで。 (gdb) bt #0 PageAddItem (page=0xb5835260 "", item=0x84e4d04 "J\002", size=28, offsetNumber=3, overwrite=0 '\0', is_heap=1 '\001') at bufpage.c:249 #1 0x…

同時実行制御。スナップショット

スナップショットに関する宿題の答え データが複数ページにまたがっている場合、次のResultSet#next()で次のページを読む前に別のトランザクションによってデータが変えられたどうなる?文レベルの読み取り一貫性があるのなら、書き換わる前のデータが読める…

トランザクションブロックのステート

トランザクションブロックのステートというものがある。クライアントからみたとき状態らしい。前回のJDBCを使ったプログラムを動かしてとりあえず次のように遷移することを確認した。 TBLOCK_STARTED TBLOCK_BEGIN TBLOCK_INPROGRESS TBLOCK_ABORT_PENDING T…

JDBCドライバ。PreparedStatement#setNull()とParameterMetaData

たとえば、PostgreSQLでは、下のようなコードでbbalanceカラムがINTEGER型のときに、NULLを設定するためにPreparedStatement#setNull()の第2引数に適当なsqlTypeを指定すると「型がちがうよ」と怒られる。 PreparedStatement ps = conn.prepareStatement("up…

JDBCドライバとバックエンドのやりとり。フロントエンド/バックエンドプロトコル

追記:キャプチャの結果が間違っていた(Row descriptionとData rowを混同していた)ので直した。 追記:JDBCドライバのログ出力も載せた。PostgreSQLのフロントエンド/バックエンドプロトコルを、JDBCを使うプログラムを使って確認してみた。通信のキャプチ…

JDBCドライバとバックエンドのやりとり

バッファ管理まわりはまだまだ調べることがたくさんあるけど、気分転換がてらJDBCドライバとバックエンドのやりとりを調べてみた。ちょっと推測もまじっている。Statementを使ってもPreparedStatmentを使っても拡張問い合わせプロトコルと呼ばれるプロトコル…

バッファ管理。clock sweepアルゴリズム、BufferAccessStrategyData構造体

clock sweepアルゴリズム clock sweepアルゴリズムは、使用頻度のもっとも低いものを選択するアルゴリズム。厳密にバッファの利用頻度を管理できないがLRUよりもオーバヘッドが少ないらしい。バッファはフレームごとに使用された回数を保持しているが、この…

バッファ管理。共有メモリバッファの大きさ

postgresql.confで共有メモリバッファの大きさを表すパラメータを設定できる。 デフォルトは次のように32MBで設定されてる。 shared_buffers = 32MBこの場合、コード上ではこう計算されて、 val *= KB_PER_MB / (BLCKSZ / 1024);デフォルトでは次の値で計算…

バッファ管理。BufferAllocでキャッシュにヒットしない場合

BufferAllocでキャッシュにヒットしない場合 BufferAlloc StrategyGetBuffer関数からバッファを取得する。 バッファがダーティならフラッシュしてから利用。 すでに使われたことがある?(BM_TAG_VALIDのビットが立っている)バッファについてはハッシュテー…

Distributed TP: The XA Specification

ここからダウンロードできた。登録が必要だったけど。 http://www.opengroup.org/public/pubs/catalog/c193.htmPostgreSQLのコード読みすすめたら、トランザクションまわりでいずれ必要になりそう。80ページなので読めない量ではない。

バッファ管理。バッファの読み書き

バッファプールの初期化を見てみる InitBufferPool バッファの領域(BufferDescriptorsとかBufferBlocks)を初期化。共有メモリから割り当てている。 BufferBlocksって単なるcharのポインタ。 バッファのデータがwrite()されるまでを見てみる FlushBuffer ト…

バッファ管理。タプルとかページとか

RelationPutHeapTuple()、ExecutePlan()を読んでの自分なりの理解。 昨日の宿題。タプルについてわかったこと HeapTupleHeaderData タプルのヘッダを表す。このヘッダの後ろにタプル本来のデータが並ぶ。このデータ構造とそのうしろに並ぶデータがページに格…

pg_filedumpを使ってみる

pg_filedumpというファイル(heap、index、control file)の中身を読みやすく出力してくれるツールがあることを知ったので試してみた。 http://sources.redhat.com/rhdb/utilities.htmlダウンロードしてPostgreSQLファイルのソースのcontribディレクトリに展開…

バッファ管理。GDBでタプルの実データを見る

こうしたら見れた。 「tuple」はHeapTuple(HeapTupleDataのポインタ)の変数。 (gdb) p (char *)tuple->t_data + tuple->t_data->t_hoff $55 = 0x935e41c "\001" (gdb) x/10c 0x935e41c 0x935e41c: 1 '\001' 0 '\0' 0 '\0' 0 '\0' 17 '\021' 97 'a' 98 'b' …

バッファ管理の仕組みに苦戦中

バッファ管理の仕組みを理解したいなぁと思っているんだけど、なかなか難しい。 HeapTupleHeader、HeapTupleData、TupleTableSlotなどという構造体の役割の違いがいまいち理解できない。明日はこのあたりを参考にしてもうちょっとがんばる。 https://www.cod…

チェックポイントでの同期

昨日疑問に思ったチェックポイント処理を見てみた。やっぱりチェックポイントでも同期していた。チェックポイントはwriter processが担当する。ソースファイルでいうとbgwriter.c 。チェックポイントの処理ではDBMSのバッファキャッシュ上のダーティなデータ…

トランザクションログへの同期

Linuxだとデフォルトでは fdatasync() が使われることを確認。同期するのは、トランザクションログだけで、それ以外のファイルへは同期はしていなさそう(OSにまかせている)。関数で言うとXLogWrite()とか、issue_xlog_fsync()とか、BasicOpenFile()あたり…

index-only (別名 index covering)

tgkさんのとこで、PostgreSQLは「インデックスだけ見てデータは見ない」ということができないらしいという話があり、これが気になっていました。 結合方式とインデックスの関係 INをEXISTSに書き換えると速くなるサンプルSQLを作るのは難しい まさかと思って…

デバッグオプションをつけてコンパイル

上のリンク先の「PostgreSQL研究所」の5回目ではOPTIMIZER_DEBUGの設定にソースコードを修正していたのですが、「PostgreSQLの内部構造」のプランナの説明ではconfigureへのパラメータで設定していたのでそっちを参考にしました。こうするのがよさげです。 c…

参考になる資料とか その2

石井さんが執筆した雑誌記事一覧 PostgreSQLの内部構造 石井さんのPostgreSQL研究所という連載が勉強になります(ほかの記事はまだ読めてない)。

ソースコードのブラウジングにcscope

これまでPostgreSQLのソースコードを読むのにEmacsとetagsの組み合わせを使っていたんですが、やはり関数の呼び出し元へジャンプできないのは辛いので別のツールを検討してみました。まず使ってみたのはglobal。ちょっと使ってみたかぎりでいえば悪くない。…

参考になる資料とか

PostgreSQLのソースコード解析資料 対象としているのがバージョン7系ですが、関数の呼び出し順序やデータ構造などが参考になります。こういう資料は助かります。(追記バージョン7系だけでなく8系を扱っているものもありました。) OProfile による PostgreS…

ソースコードをブラウジングとか

コードを簡単に読むいい方法ないかなぁとか言っていたんですが、フツーにWebでブラウズできることがわかりました。しかも、依存関係が図で表されていたりして便利そうです。Doxygenというツールを使っているようです。 http://doxygen.postgresql.org/おっと…

PostgreSQLコードリーディング

PostgreSQLのバージョンは8.3.5。 ソースコードをブラウジングとか ソースコードのブラウジングにcscope 参考になる資料とか デバッグオプションをつけてコンパイル 参考になる資料とか その2 index-only (別名 index covering) トランザクションログへの同…

PostgreSQLのTEXT型はCLOBか否か? その2

PostgreSQLのTEXT型はCLOBか否か?のつづきです。PostgreSQLのJDBCドライバでは、CLOBをOID型(ラージオブジェクト)にマッピングしているのですが、文字としてではなくあくまでバイト列として格納しているということがわかりました。つまり、文字にたとえば…