2009-04-01から1ヶ月間の記事一覧
Pluggable Annotation Processing API はJava6から導入されたAPIです。これをつかうと、コンパイル時にアノテーションを読んでコードを生成したり、検証したりできます。javac実行時に処理できるのはドキュメント見るとわかるのですが、実はEclipseのビルド…
たまに実行計画で見かけるBitmap Heap Scan や Bitmap Index Scan が気になり調べてみた。ここの解説がわかりやすい。 【PostgreSQLウォッチ】第17回 新しい実行プラン・タイプによるPostgreSQL 8.1の性能向上Indexの種類としてビットマップインデックスとい…
8.3からORDER BYとLIMITの組み合わせが改良されたということで、どう処理されるのか見てみた。参考にしたのは以下のページ。 【特集】期待度大のバージョンアップ - PostgreSQL 8.3の改良点を徹底分析 (11) ORDER BYの高速化 PostgreSQL 8.3 に関する技術情…
explain verbose select * from hoge; みたいにexplain verboseとすると実行計画と一緒にプランツリーも出力してくれる。そうか、postgresql.confでdebug_print_planを設定しなくてもプランツリーが確認できるのか。ところで、実行計画の見方は公式のドキュ…
適当なクエリを流して、GROUP BYによる集約がどう実行されるのか見てみた。 DDLとデータ create table person ( name text primary key, country text not null, age integer not null ); insert into person values ('aaa', 'jp', 20), ('bbb', 'us', 30), …
ネストループ結合はExecNestLoop()で実行される。 TupleTableSlot * ExecNestLoop(NestLoopState *node) 気づいたこと書いてみる(順番は関係ない)。 outerとinnerをスキャンして比較項目が合致したらそれをTupleTableSlotとして返す。 返すのは1件だけ。(…
http://www.postgresql.jp/document/pg835doc/html/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHATpostgresql.confのパラメタを変更すればパースツリー、クエリツリー、プランツリーを自動でログ出力できるみたい。そうかわざわざgdbからcall ppr…
クエリの実行では、プランツリーがそのまま使われるわけではなく、プランツリー(Plan)から変換されたプランステート(PlanState)が使われる。変換を行うのはExecInitNode()。ExecInitNodeのシグネチャは次のとおり。 PlanState * ExecInitNode(Plan *node…
おとといのプランツリーのデバッグ出力を見ながらデバッグ用の名前と構造体を結び付けてみた。 PLANNEDSTMT PlannedStmt プランツリーを管理する構造体。わかりやすいところでいうとcommandTypeなど、SELECTかUPDATEかなどの区分などをもっている。 NESTLOOP…
昨日のクエリツリーのデバッグ出力を見ながらデバッグ用の名前と構造体をとりあえず結び付けてみた。ほとんどがそのままだけど、RTEがRangeTblEntryに対応するのは調べるまでわからなかった。 QUERY Query RTE RangeTblEntry 結合していると結合の結果を表す…
これからしばらくSQLのパースから実行までを見ていこうかなと思う。結合、サブクエリ、集約等がどう処理されるか理解したい。それと集合論的な考え方を身につけたいなぁ。とりあえずはNested Loop Join が行われるSQLで考える。パースツリー、クエリツリー、…
パースツリーで使われる構造体は parsenodes.h または primnodes.h に定義されている。前回のパースツリーのところで登場したものだと以下のもの。 parsenodes.hに定義された構造体 SelectStmt ResTarget ColumnRef A_Expr A_Const primnodes.hに定義された…