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

optimizer: havingの最適化

subquery_plannerで,havingの条件をwhereに移動する最適化を実行している。(planner.c:294-346行目) 以下の3パターンがある。(1)where句に移動できないケース having句に指定したカラムが,集約関数やvolatile関数だったりする場合。 集約関数などの実行結…

WAL(2)

Recovery バックエンドが異常終了した後、再起動時に実行されるリカバリは,StartupXLOGのdo-whileループで実行される。(コメントにmain redo apply loopとある箇所) ログレコードにページ(ブロック)のバックアップが含まれている場合,RestoreBkpBlocksを実…

WAL(1)

起動後またはチェックポイントが発生した後に、バッファのページを最初に更新する場合,ページ全体をログに出力する。ページのバックアップがないとbackground writerがページを書き込んでいるときにbackendがクラッシュした場合、リカバリが難しくなる。(例…

sum(int4)の高速化

backend/utils/adt/numeric.cのint4_sumで、 Datum int4_sum(PG_FUNCTION_ARGS) { int64 newval; if (PG_ARGISNULL(0)) { /* No non-null input seen so far... */ if (PG_ARGISNULL(1)) PG_RETURN_NULL(); /* still no non-null */ /* This is the first no…

operator

例えば、 select * from branches b where b.bid = 1;というSQLで'='というoperatorがどのように処理されるのか。 parserの処理 make_op()でoper(), make_op_expr()を実行し、executorが使うOpExprデータを作成する。 oper()では、operator名('=')と左辺/右…

lock manager

src/backend/storage/lmgr/READMEより:LOCKING OVERVIEWPostgreSQLは,以下の3種類のロックを使用する。 Spinlocks Spinlockは超短期的なロックを取得することを意図しており,主にLightweight lockのインフラとして使用される。 Spinlockが要求されると,…

lxrの設定

必要なソフト ・apache ・perl ・lxr 0.3.1 ・glimpse 4.18.01.glimpseのインストール ソースを展開して,configure, make, makeinstallでOK. 2.lxrのインストール (1)ソースを展開 $ gzip -dcv lxr-0.3.1.tar.gz | tar xf - $ cd lxr-0.3 (2)Makefileを編集…

Optimizer: exists

現在の実装では、exists句のsubqueryはマージされないため、テーブルのJoin方法はNested loop joinになる。 Nested loop joinでは、Outer側(以下の例ではaccounts)から1行取り出すごとにsubqueryが実行されるため、Outer側のテーブルが大きい場合、検索が非…

Optimizer: in (subquery)の最適化

pull_up_IN_clauses(), convert_IN_to_join()で、in句のsubqueryを上位の階層のqueryにマージしている。 select a.* from accounts a where a.bid in (select bid from branches b where b.bid < 10)このSQLが以下のようになる。 select a.* from accounts a…

Optimizer

PostgreSQLのOptimizerは、Parser/Rewriterで作成されたQuery structureを受け取り、Executorが使うPlan structureを生成する。Optimizerは利用可能な全てのアクセスパスを生成し、最もコストが小さいパスを選択する。 テーブルへのアクセスはTable ScanとIn…

bitmapsetのAPI

extern Bitmapset *bms_copy(const Bitmapset *a); aをコピーする。 extern bool bms_equal(const Bitmapset *a, const Bitmapset *b); aとbを比較する。一致した場合はtrueを返す。 extern Bitmapset *bms_make_singleton(int x); xで指定した整数からBitma…

bitmapset

正の整数をbitとして扱うための汎用ルーチン。 bitmapset.h, bitmapset.cで定義されている。bitmapsetでは整数nは、右からn番目のビットが立った2進数へ変換されて扱われる。 例: 0 -> 00000001 1 -> 00000010 2 -> 00000100 3 -> 00001000bitmapセットのデ…

add_path()

optimizer/util/pathnode.cのadd_path()で,pathの候補を追加する。 pathを追加する前に、既に追加されているpathとcompare_fuzzy_path_costs()でコストを比較して、コストが高いpathは削除される(追加されない)。 コストが大体おなじだったときは、pathkey(…

join方法を決めているところ

make_join_rel() -> add_paths_to_joinrel() ここでmerge join, nestloop join, hash joinのpathが作成される。 そしてset_cheapest()でコストが小さいpathが選択される。

lxrの設定

lxr-0.3.1でversionsなどで指定するディレクトリ名に'_'を使いたい場合、Config.pm::verexpandの正規表現に'_'を追加する。そうしないとdbdir, sourcerootなどが正しくならない。