2015/03/12

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

前回はオプティマイザー周りに入ったのでした。


多分 optimizer の planner.c あたりを読み進めると検索プランの作成方法が、
Portal あたり(どこだ?)を読み進めると、検索プランに従って実際に検索を行う処理が見つかる気がする。

今回は Portal の方にあたりをつけて読み進めてみることにする。

CreatePortal

  • http://127.0.0.1:9292/home/postgres/src/backend/utils/mmgr/README
  • readmeみる
  • mmgr は Memory Manager っぽい
  • Context単位でメモリ管理をするようなモデルらしい

PortalDefineQuery

parseされたStatementを受け取っているので、ここで実行?
statement 名を設定しているだけだった。。。

PortalStart

実行準備とのこと
なにやら strategy にしたがって動作している

PortalSetResultFormat

見てない

PortalRun

多分ここが実行。。。
時間切れだったので、次回はここから。

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

前回の続き、フロントエンドとバックエンド間の通常操作サブプロトコルのひとつ、Queryを読んでみることにした。

ここから
https://github.com/postgres/postgres/blob/master/src/backend/tcop/postgres.c#L3969

exec_simple_queryに入った

https://github.com/postgres/postgres/blob/master/src/backend/tcop/postgres.c#L824
  • start_xact_command - トランザクション?いったん飛ばす
  • drop_unnamed_stmt - 名無しのステートメントを除去?一端とばす
  • MemoryContextSwitchTo
  • pg_parse_query - クエリをパースしてツリーを作るっぽい
  • コンテキスト戻している
  • ツリーをトラバースしている。。。
    • pg_plan_queries - クエリプラン作成?ここで色々しているとのこと
    • Portalってなんだろう?カーソルのことらしい
    • CommandCounterIncrement トランザクション関連らしい。飛ばす
      home/postgres/src/backend/access/transam/README トランザクションシステムの説明

pg_plan_queriesからオプティマイザーあたりに入った

  • プラグインでoptimizerのプランナーフックを仕掛けることが可能っぽい
  • pull_up_sublinks - any/existsを内部的にjoinに変形するらしい

オプティマイザーの全体を俯瞰した方がよいかと思いREADMEを見る

https://github.com/postgres/postgres/blob/master/src/backend/optimizer/README#L286
optimizerの動作についての説明がのっていた

時間切れ、次回はここから見ていこう。。。