2009-02-01から1ヶ月間の記事一覧
この2つの構造体の役割がわからない。コメントによるとインデックススキャンに必要な内部の状態らしい。 BTScanOpaqueData BTScanPosData backend/access/nbtree/READMEを読んで明日もういっかい考える。
これまでにタプルの追加と削除を軽く見たので、今度はタプルの更新を見てみようと思った。だけど、Heap Only Tuple(HOT)の関係でタプルの更新処理にはインデックスに関するものも出てくる。ということで、先にインデックスを見ることにした(単にインデッ…
DELETEを実行するとだいたいこんな流れ。 条件に合ったタプルを持ってくる。持ってくるときの処理はバッファ管理。バッファの読み書きと同じ。(リンク先も今回もシーケンススキャンされることを前提。) HeapTupleSatisfiesUpdate()を呼んでタプルが更新可…
トランザクションが終了すれば実質のロックは開放されるが、ページ上のタプルに対しロック時にオンにされたビットフラグはトランザクションのコミットやロールバックではオフにされない。 ロックが必要な処理(heap_lock_tuple(), heap_update(), heap_delet…
チューニングポイントに焦点をあてて(なぜ速くなるのかを考えて)コードを読むとおもしろそう。 参考にさせてもらいます。 PostgreSQLを高速化する16のポイント PostgreSQL パフォーマンスチューニングまとめ わかるPostgreSQLの設定とチューニング
【PostgreSQLウォッチ】第20回 PostgreSQL 8.1ベータ・テスト開始,新機能ロールと共有行ロックを参考にFKのチェックが行われる流れを確認した。まず準備としてリンク先と同じように次のようなSQLをpsqlで実行。 CREATE TABLE t1(i INTEGER PRIMARY KEY, j I…
昨日の宿題への回答。 CHECKPOINTの処理でトランザクションが未確定の変更がフラッシュされるのか? 答え される。タプルを追加し、まだトランザクションをコミットもロールバックもしていない時に、CHECKPOINTを実行して確かめた。フラッシュされたかどうか…
CLOGのフォーマット CLOGではトランザクションごとのコミット状態のデータを持つ。ひとつのトランザクションにつき2ビットしか使わない。要するに状態は4種類だけということ。とりうる状態は次のように定義されている。 #define TRANSACTION_STATUS_IN_PROGR…
チェックポイントでLSNを参照するか? バッファ管理。タプルの追加。宿題への回答でLSNを調べたときに、LSNがチェックポイントのときにも参照されるかどうか未確認と書いたけど、参照されていた。 チェックポイントで、ダーティーなページをフラッシュする前…
これまで区別があいまいだったデータ構造を整理してみた。 バッファ関連 BufferDesc バッファ記述子。共有バッファを構成する1フレーム。制御情報を持つ。Page(Block)を管理する。 Buffer BufferDescの識別子相当。1はじまり。BufferDescの配列のindexに使わ…
きのうの宿題の回答 タプル追加のためにバッファを取得するロジックはどうなっている? いろんな条件があるけど、よくありそうなケースは開き領域があれば今のページ、なければ新しいページを取得。テーブルに空きを残すためのFILLFACTORが考慮されている。F…
OIDとオブジェクトの名前の相互変換に便利なツールがcontribにあることを知った。これまで、pg_classとかカタログを使ったSQLを使わないと変換できないと思ってた。これは便利。インストール $ cd /usr/local/src/postgresql-8.3.5/contrib/oid2name/ $ make…
チェックポイントの処理(CheckPointGuts())でSUBTRANS、MultiXact、TwoPhaseというような用語が出てくる。それぞれ、サブトランザクション、マルチトランザクション、2相コミットのことだと思うが、サブトランザクションとマルチトランザクションが何のこ…
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…
たとえば、PostgreSQLでは、下のようなコードでbbalanceカラムがINTEGER型のときに、NULLを設定するためにPreparedStatement#setNull()の第2引数に適当なsqlTypeを指定すると「型がちがうよ」と怒られる。 PreparedStatement ps = conn.prepareStatement("up…
追記:キャプチャの結果が間違っていた(Row descriptionとData rowを混同していた)ので直した。 追記:JDBCドライバのログ出力も載せた。PostgreSQLのフロントエンド/バックエンドプロトコルを、JDBCを使うプログラムを使って確認してみた。通信のキャプチ…
バッファ管理まわりはまだまだ調べることがたくさんあるけど、気分転換がてらJDBCドライバとバックエンドのやりとりを調べてみた。ちょっと推測もまじっている。Statementを使ってもPreparedStatmentを使っても拡張問い合わせプロトコルと呼ばれるプロトコル…
clock sweepアルゴリズム clock sweepアルゴリズムは、使用頻度のもっとも低いものを選択するアルゴリズム。厳密にバッファの利用頻度を管理できないがLRUよりもオーバヘッドが少ないらしい。バッファはフレームごとに使用された回数を保持しているが、この…
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 StrategyGetBuffer関数からバッファを取得する。 バッファがダーティならフラッシュしてから利用。 すでに使われたことがある?(BM_TAG_VALIDのビットが立っている)バッファについてはハッシュテー…
ここからダウンロードできた。登録が必要だったけど。 http://www.opengroup.org/public/pubs/catalog/c193.htmPostgreSQLのコード読みすすめたら、トランザクションまわりでいずれ必要になりそう。80ページなので読めない量ではない。
バッファプールの初期化を見てみる InitBufferPool バッファの領域(BufferDescriptorsとかBufferBlocks)を初期化。共有メモリから割り当てている。 BufferBlocksって単なるcharのポインタ。 バッファのデータがwrite()されるまでを見てみる FlushBuffer ト…
RelationPutHeapTuple()、ExecutePlan()を読んでの自分なりの理解。 昨日の宿題。タプルについてわかったこと HeapTupleHeaderData タプルのヘッダを表す。このヘッダの後ろにタプル本来のデータが並ぶ。このデータ構造とそのうしろに並ぶデータがページに格…
pg_filedumpというファイル(heap、index、control file)の中身を読みやすく出力してくれるツールがあることを知ったので試してみた。 http://sources.redhat.com/rhdb/utilities.htmlダウンロードしてPostgreSQLファイルのソースのcontribディレクトリに展開…
こうしたら見れた。 「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' …
create table foo(a int, b int); select * from foo where (a, b) in ((1,1),(2,2)); OracleとPostgreSQLとMySQLでは使える。 SQL ServerとDB2では使えない。