投稿

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

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

前回の続き。先日のサッポロビームで活動してきた。
今回はほとんどコードを読んでいない。
postgres.c の PostgresMain の query とか parse とは?というあたりを調べた。
あとはPostgreSQLのドキュメントを色々読んでた。
"簡易問い合わせ"と"拡張問い合わせ" PostgreSQLのドキュメントの「フロントエンド/バックエンドプロトコル」が参考になります。通常利用される問い合わせプロトコルに"簡易問い合わせ"と"拡張問い合わせ"があるとのこと。
フロントエンド/バックエンドプロトコル
接続開始通常操作簡易問い合わせQuery拡張問い合わせParseBindExecute関数呼び出しFunctionCall(非推奨らしい、Bind & Executeを利用せよとのこと)その他特殊な操作向けCopyなど...接続終了
PostgresMain ではこのプロトコルの内、接続開始後の各サブプロトコルの種類を判別してそれぞれのサブプロトコルで定義される操作を呼び出している模様。

簡易問い合わせと拡張問い合わせの概要は次の通り。
"簡易問い合わせ"プロトコルでは、フロントエンドはテキストで問い合わせ文字列を単に送信し、バックエンドによって解析され、即実行されます。"拡張問い合わせ"プロトコルでは、問い合わせの処理は、解析、パラメータ値の結び付け、そして実行という複数の段階に分離されます。 これは複雑性が加わりますが、柔軟性と性能という点で利点が生まれます。 このあたりを念頭に各操作の内容を読んでいけばなんとかなりそう。
その他 演算子クラス/演算子族 ひたすらドキュメントを読んでたらインデックス周りで演算子クラスとか演算子族というのが出てきた。 インデックスの種類やデータ型ごとに演算子クラスをユーザが定義することで、独自にインデックスを拡張できる?らしい。演算子クラスをまとめたのが演算子族?なのかな?インデックス周りを確認するときにもうちょっとちゃんと調べる予定。https://www.postgresql.jp/document/9.3/html/indexes-opclass.html Notify 肉さん情…

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 とかめっちゃでてくる!