2009-02-01から1ヶ月間の記事一覧

B-Treeインデックス。内部状態?

この2つの構造体の役割がわからない。コメントによるとインデックススキャンに必要な内部の状態らしい。 BTScanOpaqueData BTScanPosData backend/access/nbtree/READMEを読んで明日もういっかい考える。

B-Treeインデックス。pg_filedumpと検索時の呼び出しシーケンスの確認

これまでにタプルの追加と削除を軽く見たので、今度はタプルの更新を見てみようと思った。だけど、Heap Only Tuple(HOT)の関係でタプルの更新処理にはインデックスに関するものも出てくる。ということで、先にインデックスを見ることにした(単にインデッ…

バッファ管理。タプルの削除

DELETEを実行するとだいたいこんな流れ。 条件に合ったタプルを持ってくる。持ってくるときの処理はバッファ管理。バッファの読み書きと同じ。(リンク先も今回もシーケンススキャンされることを前提。) HeapTupleSatisfiesUpdate()を呼んでタプルが更新可…

バッファ管理。タプルのロックの開放

トランザクションが終了すれば実質のロックは開放されるが、ページ上のタプルに対しロック時にオンにされたビットフラグはトランザクションのコミットやロールバックではオフにされない。 ロックが必要な処理(heap_lock_tuple(), heap_update(), heap_delet…

PostgreSQLのコードを読むときに参考にしたいチューニングポイント

チューニングポイントに焦点をあてて(なぜ速くなるのかを考えて)コードを読むとおもしろそう。 参考にさせてもらいます。 PostgreSQLを高速化する16のポイント PostgreSQL パフォーマンスチューニングまとめ わかるPostgreSQLの設定とチューニング

バッファ管理。タプルの追加時のFKチェック

【PostgreSQLウォッチ】第20回 PostgreSQL 8.1ベータ・テスト開始,新機能ロールと共有行ロックを参考にFKのチェックが行われる流れを確認した。まず準備としてリンク先と同じように次のようなSQLをpsqlで実行。 CREATE TABLE t1(i INTEGER PRIMARY KEY, j I…

バッファ管理。チェックポイント。トランザクションが未確定のデータのフラッシュについて

昨日の宿題への回答。 CHECKPOINTの処理でトランザクションが未確定の変更がフラッシュされるのか? 答え される。タプルを追加し、まだトランザクションをコミットもロールバックもしていない時に、CHECKPOINTを実行して確かめた。フラッシュされたかどうか…

CLOG

CLOGのフォーマット CLOGではトランザクションごとのコミット状態のデータを持つ。ひとつのトランザクションにつき2ビットしか使わない。要するに状態は4種類だけということ。とりうる状態は次のように定義されている。 #define TRANSACTION_STATUS_IN_PROGR…

バッファ管理。チェックポイント

チェックポイントでLSNを参照するか? バッファ管理。タプルの追加。宿題への回答でLSNを調べたときに、LSNがチェックポイントのときにも参照されるかどうか未確認と書いたけど、参照されていた。 チェックポイントで、ダーティーなページをフラッシュする前…

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

これまで区別があいまいだったデータ構造を整理してみた。 バッファ関連 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よりもオーバヘッドが少ないらしい。バッファはフレームごとに使用された回数を保持しているが、この…

S2JDBC-Gen の正式版を含んだ Dolteng 0.35.0 がリリース

S2JDBC-Gen 2.4.34 が含まれているDolteng 0.35.0 がリリースされました!DoltengのインストールからS2JDBC-Genを実際に使うまでの一連の手順は、S2JDBC-Genでデータベースリファクタリングに以前書いたので、ぜひ試してもらえればと思います。このエントリ…

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

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' …

左辺に複数の式を指定する場合のIN演算子

create table foo(a int, b int); select * from foo where (a, b) in ((1,1),(2,2)); OracleとPostgreSQLとMySQLでは使える。 SQL ServerとDB2では使えない。