PostgreSQLのコードを読む話(2)
前回の続き。先日のサッポロビームで活動してきた。
今回はほとんどコードを読んでいない。
postgres.c の PostgresMain の query とか parse とは?というあたりを調べた。
あとはPostgreSQLのドキュメントを色々読んでた。
PostgresMain ではこのプロトコルの内、接続開始後の各サブプロトコルの種類を判別してそれぞれのサブプロトコルで定義される操作を呼び出している模様。
簡易問い合わせと拡張問い合わせの概要は次の通り。
前回と同じくここから。通常操作のサブプロトコルからひとつ(Queryがよいかな)を読んで、その後DBの物理ファイルやインデックス周りの箇所を調べる予定。
今回はほとんどコードを読んでいない。
postgres.c の PostgresMain の query とか parse とは?というあたりを調べた。
あとはPostgreSQLのドキュメントを色々読んでた。
"簡易問い合わせ"と"拡張問い合わせ"
PostgreSQLのドキュメントの「フロントエンド/バックエンドプロトコル」が参考になります。通常利用される問い合わせプロトコルに"簡易問い合わせ"と"拡張問い合わせ"があるとのこと。フロントエンド/バックエンドプロトコル
- 接続開始
- 通常操作
- 簡易問い合わせ
- Query
- 拡張問い合わせ
- Parse
- Bind
- Execute
- 関数呼び出し
- FunctionCall(非推奨らしい、Bind & Executeを利用せよとのこと)
- その他特殊な操作向け
- Copy
- など...
- 接続終了
PostgresMain ではこのプロトコルの内、接続開始後の各サブプロトコルの種類を判別してそれぞれのサブプロトコルで定義される操作を呼び出している模様。
簡易問い合わせと拡張問い合わせの概要は次の通り。
"簡易問い合わせ"プロトコルでは、フロントエンドはテキストで問い合わせ文字列を単に送信し、バックエンドによって解析され、即実行されます。
"拡張問い合わせ"プロトコルでは、問い合わせの処理は、解析、パラメータ値の結び付け、そして実行という複数の段階に分離されます。 これは複雑性が加わりますが、柔軟性と性能という点で利点が生まれます。このあたりを念頭に各操作の内容を読んでいけばなんとかなりそう。
その他
演算子クラス/演算子族
ひたすらドキュメントを読んでたらインデックス周りで演算子クラスとか演算子族というのが出てきた。
インデックスの種類やデータ型ごとに演算子クラスをユーザが定義することで、独自にインデックスを拡張できる?らしい。演算子クラスをまとめたのが演算子族?なのかな?インデックス周りを確認するときにもうちょっとちゃんと調べる予定。
Notify
肉さん情報。バックエンドからフロントエンド側に何らかのタイミングで通知を送る機能があるらしい。そのうち調べる。
次回
https://github.com/postgres/postgres/blob/master/src/backend/tcop/postgres.c#L3969前回と同じくここから。通常操作のサブプロトコルからひとつ(Queryがよいかな)を読んで、その後DBの物理ファイルやインデックス周りの箇所を調べる予定。
参考資料
- PostgreSQLの構造とソースツリー
http://lets.postgresql.jp/documents/technical/sourcetree - PostgreSQL9.3.2
https://www.postgresql.jp/document/9.3/html/index.html
コメント
コメントを投稿