2009-04-01から1ヶ月間の記事一覧

Eclipse で Pluggable Annotation Processing API

Pluggable Annotation Processing API はJava6から導入されたAPIです。これをつかうと、コンパイル時にアノテーションを読んでコードを生成したり、検証したりできます。javac実行時に処理できるのはドキュメント見るとわかるのですが、実はEclipseのビルド…

エグゼキュータ。ビットマップヒープスキャン(Bitmap Heap Scan)

たまに実行計画で見かけるBitmap Heap Scan や Bitmap Index Scan が気になり調べてみた。ここの解説がわかりやすい。 【PostgreSQLウォッチ】第17回 新しい実行プラン・タイプによるPostgreSQL 8.1の性能向上Indexの種類としてビットマップインデックスとい…

エグゼキュータ。LimitとSort

8.3からORDER BYとLIMITの組み合わせが改良されたということで、どう処理されるのか見てみた。参考にしたのは以下のページ。 【特集】期待度大のバージョンアップ - PostgreSQL 8.3の改良点を徹底分析 (11) ORDER BYの高速化 PostgreSQL 8.3 に関する技術情…

EXPLAINでプランツリーの出力

explain verbose select * from hoge; みたいにexplain verboseとすると実行計画と一緒にプランツリーも出力してくれる。そうか、postgresql.confでdebug_print_planを設定しなくてもプランツリーが確認できるのか。ところで、実行計画の見方は公式のドキュ…

エクゼキュータ。集約(Aggregate)

適当なクエリを流して、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), …

エクゼキュータ。ネストループ結合(Nested Loop Join)

ネストループ結合は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…

エクゼキュータ。PlanStateとExprState

クエリの実行では、プランツリーがそのまま使われるわけではなく、プランツリー(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に定義された…