faster version of AllocSetFreeIndex for x86 architecture

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

UNIV_EXPECT gccでは以下のように定義される。 # define UNIV_EXPECT(expr,constant) __builtin_expect(expr, constant)__builtin_expectはプログラマが指定できる分岐予測の情報で、exprで指定した条件がconstantで指定した結果になる可能性が高いことをコ…

transaction

read_view_open_now read_view_t(現在実行中のトランザクションIDのリスト: PostgreSQLのsnapshotに相当する)を作成する。(1)read_view_create_lowでメモリを確保。 実行中のトランザクション数は、trx_sys->trx_listに登録されている。 (2)view->low_limit_…

Improvement of search for a binary operator

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

memory manager (2)

mem_heap_create_func memory heapを作成する。mem_heap_createなどのマクロから実行される。 (関数名がXXXXX_funcなどとなっている場合、マクロ経由で実行される)引数 n: 先頭のブロックサイズを指定する。0を指定した場合はデフォルトサイズ (MEM_BLOCK_ST…

memory manager

innobaseのmemory managerはmemory poolとmemory heapで構成されている。 memory poolは、最初にmysqlのパラメータinnobase_additional_mem_pool_sizeで指定された大きさのバッファを確保して、そこから必要なメモリを割り当てていく。このバッファからメモ…

hash

mysqlのハッシュテーブルは、PostgreSQLと同じリニアハッシュ・アルゴリズムを使用している。 (PostgreSQLのハッシュテーブル:http://www.hi-ho.ne.jp/a_ogawa/document/pg_dynahash.pdf) PostgreSQLと違う点。 - ハッシュテーブルにデータを登録するたびに…

innodbのレコードの構造

レコードのフォーマットはrem0rec.cに詳しい説明がある。 OLD STYLEとNEW STYLEの2種類がある。 (MySQL Internals Manualの説明はOLD STYLEのもの)index->table->compが1だとNEW STYLE。 compはdict_mem_table_create()で設定している。 ha_innobase::create…

Improve the comparison of NUMERIC data

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

gdb memo

callコマンドで関数を実行できる。例) innodbのrecordの情報を出力する (1)ブレークポイントを設定 break rec_init_offsets(2)ブレークしたらデバッグ用の関数を実行 call rec_print(stderr, rec, index) continueこれでmysqlのerrファイル(mysqlhome/varに…

mysql-5.1のstorage engine

storage engineの実装は、storageディレクトリにある bdb heap innobase myisam myisammrg ndbがある storage engineのインタフェースには、handlerとhandlertonがある handlerはinsertやselectなど、テーブルを操作するインターフェースを定義したclass。sq…

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…