postgresql

faster version of AllocSetFreeIndex for x86 architecture

http://archives.postgresql.org/pgsql-hackers/2009-06/msg00159.phpPostgresqlのmemory managerで、空きブロックリストのインデックスを計算する処理を高速化するパッチ。現在のコードは、以下のようにループして計算しているが static inline int AllocSe…

Improvement of search for a binary operator

http://archives.postgresql.org/pgsql-patches/2006-04/msg00228.php'='などの演算子(operator)を、どのように処理するか決める処理を高速化するパッチ。operatorはシステムカタログpg_operatorに登録されており、ユーザーがcreate operatorで登録すること…

Improve the comparison of NUMERIC data

patch applied. http://archives.postgresql.org/pgsql-patches/2006-02/msg00080.php

Allow an alias for the target table in UPDATE/DELETE

UPDATE accounts AS a SET a.abalance = a.abalance + 10 WHERE a.aid = 1; のようにupdateやdelete対象のテーブルに、別名をつけることが出来るようにするパッチ。http://www.hi-ho.ne.jp/a_ogawa/document/patches/allow_alias_update.patch

Virtual tuple slots versus TOAST: big problem

TOASTが必要なTupleをinsert/updateした時、backendがcrushする問題について。 http://archives.postgresql.org/pgsql-hackers/2005-11/msg01016.php(1)ExecInsertにTupleTableSlot(slot)が渡される。 このときslotのvirtual tuple領域(slot->tts_valuesなど…

PostgreSQL性能向上パッチの効果検証

http://www.hi-ho.ne.jp/a_ogawa/document/index.htm

gccのバージョンによる違い

scale factor: 10 select b.bid, count(*) from accounts a, branches b where a.bid = b.bid and a.abalance > 100 group by b.bid;gcc-3.2.3: 1.213547 s gcc-3.4.4: 1.045556 s

vacuum (7)

HeapTupleSatisfiesVacuum Vacuumを実行するためにタプルの状態をチェックする。タプルが実行中の全てのトランザクションから参照できない場合、HEAPTUPLE_DEADを返す。HEAPTUPLE_DEADだったらVacuumが削除できる。 タプルがdeleteされているが、実行中のい…

vacuum (6)

VacPage vacuumするページの情報を記録する。offsets_used以外の情報は、scan_heapで設定される。freeにはvacuumでdeadタプルを削除してページの断片化を解消した後の空き領域(pd_upperとpg_lowerの間のスペース)の大きさが設定される。offsets配列にはdead…

vacuum (5)

scan_heap この関数はfull vacuumするときにfull_vacuum_relから実行される。onerelで指定されたテーブルの全てのページを調べ、以下の処理を行う。 タプルのcommit status(Xmin)を設定する 削除できるタプルがあるページのリスト(vacuum_pages)を作成する …

vacuum (4)

vac_open_indexes relに指定したテーブルのindexを全てopenする。テーブルと同じlock modeを使う。 vac_close_indexes vac_open_indexesでopenしたindexをcloseする。 vpage_insert vacpagelist配列にvacpageを追加する。vacpagelist配列が初期化されていな…

vacuum (3)

vacuum_delay_point vacuumを実行するプロセスよりも通常のトランザクションを実行するプロセスを優先させるために、sleepを実行してvacuumプロセスを遅延させる。この仕組みはpostgresql.confでvacuum_cost_delayを1以上に設定したときに有効になる。この関…

vacuum (2)

lazy_vacuum_heap vacrelstats->dead_tupleに登録されたタプルを、テーブルから削除する。 (1)LockBufferForCleanupでページをロックする (2)lazy_vacuum_pageでページ内のアイテムを削除する (3)lazy_record_free_spaceでページの空き領域を登録 (4)ロック…

vacuum (1)

lazy_vacuum_rel テーブルをlazy vacuumする。(full vacuumではなく、オプション無しで実行したときのvacuum) (1)vac_open_indexesでテーブルのインデックスを全部オープンする。 (2)lazy_scan_heapでvacuumのメイン処理を実行する。 (3)vac_close_indexesで…

WALの書き方

(1)START_CRIT_SECTIONを実行 (2)ページを更新 (3)ログレコードのデータを作成する 例: XLogRecDataのdataに更新したデータを設定、lenにdataの長さを設定する。 bufに更新したページを設定、buffer_stdをtrueにする。 (4)XLogInsertでログレコードを書き出…

btree index (24)

ユニークインデックスについて ユニークインデックスにアイテムを登録するとき、_bt_check_uniqueでユニークをチェックしている。このとき登録するアイテムと同じキーを持つアイテムが見付かって、それが削除可能である場合(実行中の全てのトランザクション…

btree index (23)

_bt_binsrch pageに登録されているデータが1, 2, 3, 3, 3, 3, 3, 7, 8, 9だとすると:(1)nextkey = falseのとき: item >= scankeyの先頭の位置が検索できる 検索キー 0 1 2 3 4 7 8 9 10 ---------------------------------------------------------------- n…

btree index (22)

_bt_endpoint btree indexの先頭または末尾のアイテムから、検索条件を満たすアイテムを探す。先頭から探す場合、以下の処理を行う。 (1)_bt_getendpointで左端のリーフページを取得する (2)ページの先頭のアイテムを取得する (3)_bt_checkkeysで検索条件を…

btree index (21)

_bt_delitems btree indexのリーフページからアイテムを削除する。一度に複数のアイテムを削除できる。ページの更新はPageIndexMultiDeleteで実行する。ページを更新したらログレコードを出力している。 PageIndexMultiDelete インデックスのページから複数…

btree index (20)

_bt_spoolinit ソートしてbtree indexを構築するとき,indexのアイテムを一時的に登録して ソートするためのスプール領域(BTSpool)を作成する。スプールサイズはmaintenance_work_mem(default: 16Mbyte)が使用される。ただしdead tupleを登録するためのスプ…

btree index (19)

_bt_relandgetbuf obufに指定したBufferのロックを開放してから,blknoで指定したBufferのロックを取得する。 _bt_get_endpoint 指定したlevelの右端か左端のページを取得する。rightmostをtrueに指定したら右端を取得する。leaf pageを取得するときはfast r…

btree index (18)

_bt_next 検索条件を満たす次のIndex Itemを取得する。 scan->currentItemDataの位置から_bt_stepで1件ずつ取り出し、_bt_checkkeysで条件を満たしているかチェックする。条件に一致するItemが見つかったら、trueを返す。_bt_checkkeysでcontinuescanがfalse…

btree index (17)

_bt_mkscankey_nodata IndexTupleを比較するためのScanKey構造体を作成する。データを比較するための関数が設定されるが、比較するデータは設定されない。この関数で作成されたScanKeyはIndexTupleをソートするために使用される。 _bt_freeskey _bt_mkscanke…

btree index (16)

_bt_step 次のアイテムに移動する。bufPに現在Read中のBuffer(ページ)を指定する。dirに移動する方向を指定する。ページを移動するときは、bufPは移動先のページに設定する。処理が成功したときはscan->currentItemDataを更新してtrueを返す。失敗したとき(…

btree index (15)

_bt_pagedel btree indexのページを削除する。 (1)ページが削除可能かチェックする。一番右のページ、ルートページは削除できない。ページにアイテムが残っている場合も削除できない。 (2)削除するページ(target page)の情報を取得。 (3)親のページの位置を…

btree index (14)

_bt_metapinit btree indexのmeta page(先頭のpage)を作成する。ReadBuffer(rel, NEW)で新しいページを作成し,_bt_initmetapageで初期化する。 リレーションが一時テーブルでないときは,ログレコードを出力する。 _bt_metapinitはソートしない方法でindex…

btree index (13)

btbeginscan btree indexの検索の初期化処理を行う。RelationGetIndexScanでIndexScanDesc 構造体を作成する。 btrescan btree indexの検索条件を設定する。最初に検索を実行するときはbtbeginscanから btrescanが実行される。 #0 btrescan at nbtree.c:419 …

btree index (12)

_bt_check_unique unique indexのとき登録するアイテムがユニークかチェックする。ユニークなときはInvalidTransactionIdを返す。別のトランザクションが更新中のタプルと重複している場合は、更新中のトランザクションがcommitするかabortするまでwaitする…

btree index (11)

nbtsort.cに、タプルをソートしてからbtree indexを構築するときの処理が実装されている。 _bt_sortaddtup pageにitemを追加するための関数。PageAddItemを実行してBTItemを登録する。 ただし、non-leaf pageに先頭のアイテムを登録するときはBTItemのヘッダ…

btree index (10)

_bt_buildadd sortしてからbtree indexを作成するとき、pageにアイテムを登録する関数。 pageを作成中のleaf pageの構造は以下のようになる。テーブルのpage構造とほとんど同じだが、linp0とかlastの所に細工がしてある。 (nbtsort.cより) * A leaf page bei…