2005-09-01から1ヶ月間の記事一覧

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…

設定メモ

(1)/etc/sysctl.confに以下を記述して、sysctl -pを実行する。 kernel.shmmax=1073741824 vm.dirty_writeback_centisecs=0(2)/etc/fstabのに、noatimeを指定する。

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…

pgbench

Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 4.56 2.36 2.36 7000 0.00 0.00 OpernameGetCandidates 4.09 4.47 2.11 7001 0.00 0.00 yyparse 3.99 6.53 2.06 1419187 0.00 0.00 Alloc…

btree index (9)

btree indexの構築 create index文でindexを作成するとき、btbuildが実行される。 btree indexの作成方法は以下の2通りがある。 (1)テーブルのデータをソートしてから、インデックスを構築する (2)テーブルのデータを順番に、インデックスに挿入する通常は(…

btree index (8)

_bt_compare scankeyとindex tupleを比較する。 index_getattrでindex tupleのデータを取得し,FunctionCall2で比較を実行する。 FunctionCall2には,異なるデータ型の比較をサポートするために,先頭の引数にindex tupleのデータを渡さなければいけないとい…

btree index (7)

_bt_findsplitloc btree indexのページを分割するとき,どの位置で左右に分割するかを決める。 先頭のアイテムから順にサイズを取得し,そのアイテムを左のページに追加した場合の左右の空き領域を計算する。次に_bt_checksplitlocを実行して左右の空き領域…

btree index (6)

meta page btree indexの先頭ページにはmeta pageというデータがおかれ,rootノードの位置などを記録する。(btreeではrootページが分割されるときrootページが移動するので,その位置をmeta pageで管理している) typedef struct BTMetaPageData { uint32 btm…

btree index (5)

_bt_moveright 例えば,更新トランザクション(UPD-Tr)と検索トランザクション(SEL-Tr)が,以下のように並行動作した場合, UPD-Tr: 親ノードP0を検索し,リーフページP1のポインタを取得 SEL-Tr: 親ノードP0を検索し,リーフページP1のポインタを取得 UPD-Tr…

btree index (4)

_bt_addtup ページの指定した位置に,BTItemを登録する。 offsetを指定してPageAddItemを実行する。 PageAddItem ページにItemを登録する。 PageAddItemはb-tree以外にも,tupleや他のindexのアイテムを登録するために 実行される。OffsetNumberでページ内の…

btree index (3)

_bt_insertonpg 指定したページにBTItemを登録する。 non-unique indexで重複したキーを登録する場合,以下のルールで登録する場所を決めている。(1)指定したページに登録できる場合:同じキーの先頭に挿入する。(新しく登録するアイテムが先頭になる)(2)指…

btree index (2)

_bt_doinsert btreeへBTItemを登録する。public interfaceのbtbuildやbtinsertから実行される。 (1)_bt_mkscankeyでインデックスのデータを比較するためのScanKeyを生成する (2)_bt_searchでBTItemを登録する,先頭のリーフページを取得する (3)Read lockを…

btree index (1)

Indexがあるテーブルにinsert文を実行すると、indexに登録するためにbtinsertが実行される。 #0 btinsert (fcinfo=0xbffeb8a0) at nbtree.c:225 #1 0x08289103 in FunctionCall6 (flinfo=0x83f10b0, arg1=1099692112, arg2=3221142352, arg3=3221142320, arg…

check_stack_depth

関数呼び出しが深くなるたび、各関数のローカル変数などを割り当てるためにスタック領域を消費する。再帰コールが大量に発生するなどの理由で、スタックを使い切ってしまうとSIGSEGVエラーになりプロセスが終了してしまうため、そうなる前にERRORを発生させ…

parser/keywords.c

ScanKeywords キーワードの配列。 selectなどのキーワードが列記してある。バイナリサーチで検索するためアルファベット順に記述されている。 ScanKeywordLookup() 文字列がキーワードに一致するか調べる。parserから実行される。 一致するキーワードが見つ…

データ型による性能の違い

テストテーブル作成 create table int4_test(d int4); create table int8_test(d int8); create table float4_test(d float4); create table float8_test(d float8); create table numeric_test(d numeric); create table text_test(d text); create table v…

Cache last known per-tuple offsets to speed long tuple accessを実装したときのメモ

カラム数が多いテーブルをjoinするとき,heaptuple.cのnocachegetattr()に負荷がかかる。 390行目付近のfor()ループで,カラムの先頭から調べてるので,カラム数が多いほど負荷が高くなる。ExecProject() -> ExecTargetList() -> ExecEvalExpr() -> ExecEval…

regexp_replaceを実装したときのメモ

1.backend/regex/regexec.cのpg_regexec()で,検索開始位置を設定できるように拡張する。 (これがないと,2箇所目以降の置換開始位置を決められない)○backend/regex/regexec.c ・pg_regexecに検索開始位置を指定する引数を増やす(size_t search_start)。 ・p…

AllocSetResetの高速化

AllocSetContextにisResetという変数が追加された。これはcontextの初期化やリセット時にtrueに設定され、contextからメモリを確保したときにfalseになる。 bool isReset; /* T = no space alloced since last reset */AllocSetResetではisResetがfalseのと…