投稿

1月, 2015の投稿を表示しています

PostgreSQLのコードを読む話(2)

前回 の続き。 先日のサッポロビーム で活動してきた。 今回はほとんどコードを読んでいない。 postgres.c の PostgresMain の query とか parse とは?というあたりを調べた。 あとはPostgreSQLのドキュメントを色々読んでた。 "簡易問い合わせ"と"拡張問い合わせ" PostgreSQLのドキュメントの「フロントエンド/バックエンドプロトコル」が参考になります。通常利用される問い合わせプロトコルに"簡易問い合わせ"と"拡張問い合わせ"があるとのこと。 フロントエンド/バックエンドプロトコル 接続開始 通常操作 簡易問い合わせ Query 拡張問い合わせ Parse Bind Execute 関数呼び出し FunctionCall(非推奨らしい、Bind & Executeを利用せよとのこと) その他特殊な操作向け Copy など... 接続終了 PostgresMain ではこのプロトコルの内、接続開始後の各サブプロトコルの種類を判別してそれぞれのサブプロトコルで定義される操作を呼び出している模様。 簡易問い合わせと拡張問い合わせの概要は次の通り。 "簡易問い合わせ"プロトコルでは、フロントエンドはテキストで問い合わせ文字列を単に送信し、バックエンドによって解析され、即実行されます。 "拡張問い合わせ" プロトコルでは、問い合わせの処理は、解析、パラメータ値の結び付け、そして実行という複数の段階に分離されます。 これは複雑性が加わりますが、柔軟性と性能という点で利点が生まれます。 このあたりを念頭に各操作の内容を読んでいけばなんとかなりそう。 その他 演算子クラス/演算子族 ひたすらドキュメントを読んでたらインデックス周りで演算子クラスとか演算子族というのが出てきた。 インデックスの種類やデータ型ごとに演算子クラスをユーザが定義することで、独自にインデックスを拡張できる?らしい。演算子クラスをまとめたのが演算子族?なのかな?インデックス周りを確認するときにもうちょっとちゃんと調べる予定。 htt

PostgreSQLのコードを読む話(1)

昨年末からちびちびとPostgreSQLのコードを読み始めた。 ちびちび読んでいるので、次読むときにどこ読めばいいか忘れるのでその記録。 とは言ってもそんなに C に堪能ではないので、結構飛ばしつつ流れを追っている段階。。。 まずはインデックスとかDBの物理ファイルあたりにたどりつくのが目標。 前回までに読んだところ src/backend/main/main.c コマンドでサーバーを起動したときの開始ポイント。まずはここから src/backend/postmaster/postmaster.c#PostmasterMain マスタープロセスの起動部分。マスタープロセスから起動時に各種バックエンドプロセスが、コネクション接続時にバックエンドプロセスがフォークされる模様 今回読んだところ src/backend/tcop/postgres.c#PostgresMain コネクション毎にpostmasterからフォークして作成されるバックエンドプロセスのメイン部分。コネクションを通してクエリを受け取ったりする。。。はず 次回 https://github.com/postgres/postgres/blob/master/src/backend/tcop/postgres.c#L3969 ここから。バックエンドでコマンドを受け取って種類ごとにゴニョゴニョするっぽい。 疑問 次回読み始める箇所のコマンドにあたるものの位置づけがまだ把握できていない(queryの他にparseとかある。parseは何のparse?) ディレクトリ名のtcopってなんだ? DBの物理ファイルとかバッファプール関連の初期化箇所をすっ飛ばしたっぽい。。。 Windows の場合は fork する代わりに exe ファイルを起動しまくっている? 役立つもの milkode  - とりあえず選択して Shift + S! 内部構造から学ぶPostgreSQL 設計・運用計画の鉄則  - 概要がわかる。よい なるほどUnixプロセス ― Rubyで学ぶUnixの基礎  - fork とか signal とかめっちゃでてくる!