アナライズ処理
● パースツリーからクエリーツリーを作成
● ステムカタログを参照してオブジェクトを決 定
,
情報を補足–
テーブルOID
–
列名リスト45
47
問い合わせ処理の流れ
問い合わせを受信
アナライズ処理 アナライザ
リライト処理 リライタ
プラン処理 プランナ(オプティマイ
ザ)
エグゼキュート処理 エグゼキュータ
パース処理 パーサー
問い合わせ文字列
raw parse tree
query tree
rewrite後のquery tree
plan tree
48
リライト処理
● クエリーツリーを一定のルールによって書き換 える
●
RULE
システムやVIEW
の実装に利用●
RULE
の例– CREATE RULE t1rule1 AS ON INSERT TO t1 WHERE NEW.i < 100 DO INSTEAD INSERT INTO t1 VALUES(NEW.i, NEW.j);
●
RULE
のパースツリーもシステムカタログに格 納●
RULE
パースツリーを追加,
置き換えrewrite
49
問い合わせ処理の流れ
問い合わせを受信
アナライズ処理 アナライザ
リライト処理 リライタ
プラン処理 プランナ(オプティマイ
ザ)
エグゼキュート処理 エグゼキュータ
パース処理 パーサー
問い合わせ文字列
raw parse tree
query tree
rewrite後のquery tree
plan tree
プランナ
● 一般に「オプティマイザ」と呼ばれている部分
● 「ルールベース」と「コストベース」オプティ マイザ
● クエリツリーからプランツリーを生成
–
組み込みルールを適用してクエリをより効率のよい ものに書き換え–
可能な実行方法(path)
を生成–
その中から最適なものを選ぶ–
選んだpath
をプランに変換optimizer/README
51
プランナによる書き換えの例
●
IN
をJOIN
に変換●
foo OR TRUE -> TRUE
●
(NOT (A < B)) -> (A >= B)
問い合わせ処理の流れ
問い合わせを受信
アナライズ処理 アナライザ
リライト処理 リライタ
プラン処理 プランナ(オプティマイ
ザ)
エグゼキュート処理 エグゼキュータ
パース処理 パーサー
問い合わせ文字列
raw parse tree
query tree
rewrite後のquery tree
plan tree
53
エグゼキュート処理
● プランナが作成したプランを実行
● 固有の情報
–
スナップショット● 実行中のトランザクションに関する情報
– DestReceiver
● 実行結果の送信先
executor/README
SELECT count(*) FROM t1 の プランツリー
type: AGG
startup_cost: 36.75 total_cost: 36.76 plan_rows: 1 plan_width: 0 target_list qual:
leftree:
righttree:
initPlan:
NodeTag: TARGETENTRY expr:
resno: 1 resname: count resorigtbl: 0 resorigcol: 0 resjunk: false
Plan
TargetEntry
NodeTag: AGGREF aggfnoid: 2147 aggtype: 20 target:
agglevelsup: 0 aggstar: true aggdistinct: false
AggRef
NodeTag: CONST aggfnoid: 23 aggtype: 4 constvalue:
constisnull: false constbyval: true
Const
type: SEQSCAN startup_cost: 0.00 total_cost: 31.40 plan_rows: 240 plan_width: 0 target_list qual:
leftree:
righttree:
initPlan:
Plan
NodeTag: TARGETENTRY expr:
resno: 1 resname: count resorigtbl: 0 resorigcol: 0 resjunk: false
TargetEntry
NodeTag: AGGREF varno: 1
varattno: 1 vartype: 23 vartypmod: -1 varnoold: 1 varoattno: 1
Var
55
エグゼキュータの実行
テーブル名から relfilenodeへの変換
SysCache
pg_class RelCache
heap
access method Buffer
Manager Storage Manager
磁気ディスク Manager
count(*) DestReceiver frontend/
backend protocol
フロントエンド
まとめ
●
PostgreSQL
の概要–
歴史,
開発体制,
市場動向–
機能,
構造● 実装と内部構造
–
各サブシステムの役割と構造● 問い合わせ処理の流れ
–
パーサー,
プランナ,
リライト,
プランナ,
エグゼキュータ
57
参考文献 /URL
●
PostgreSQL
完全攻略ガイド改訂第5
版/
石井達 夫/
技術評論社/2006
●
WEB+DB PRESS
「徒然PostgreSQL
散策」– Vol.16
「SQL
をカスタマイズしよう」● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol16_200-211.pdf
– Vol.20
「トランザクションログ」● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol20_224-232.pdf
– Vol.24
「テーブルの構造とディスク容量の見積も り」● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol24_214-221.pdf
●
参考文献 /URL
●
WEB+DB PRESS
「徒然PostgreSQL
散策」– Vol.25
「テーブルの構造とディスク容量の見積も り(2)
」● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol25.pdf
●
WEB+DB PRESS
「PostgreSQL
研究所」– Vol.27
「パース処理とアナライズ処理」● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol27.pdf
– Vol.28
「リライト処理」● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol28.pdf
– Vol.29
「プラン処理(1)
」● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol29.pdf