ルールが適用された後にクエリを表示するにはどうすればよいですか?


9

ドキュメントから-37.3.1.1。「ステップバイステップの最初のルール」

CREATE TABLE shoelace_log (
    sl_name    text,          -- shoelace changed
    sl_avail   integer,       -- new available value
    log_who    text,          -- who did it
    log_when   timestamp      -- when
);

CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data
    WHERE NEW.sl_avail <> OLD.sl_avail
    DO INSERT INTO shoelace_log VALUES (
                                    NEW.sl_name,
                                    NEW.sl_avail,
                                    current_user,
                                    current_timestamp
                                );

今誰かがします:

(1) UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';

そして、パーサーはこの追加のクエリを生成します

(2) INSERT INTO shoelace_log VALUES (
       shoelace_data.sl_name, 6,
       current_user, current_timestamp )
  FROM shoelace_data
 WHERE 6 <> shoelace_data.sl_avail
   AND shoelace_data.sl_name = 'sl7';

問題は、クエリ(1)が(1)+(2)にどのように書き換えられるかを知るためのツールはありますか?

回答:


5

書き換えは内部ツリー表現で行われるため、書き換えられたクエリのSQL表現を直接確認する方法はなく、これをSQLに戻すのは簡単ではありません。最も近いのはdebug_print_rewritten、その内部ツリー形式の表現をサーバーログに出力する構成パラメーターをオンにすることです。これを設定debug_print_parseおよびdebug_print_plan(場合によってはdebug_pretty_print)と組み合わせて使用​​すると、さまざまな段階でクエリがどのように変換されるかを確認できます。形式は読みにくいですが、これの詳細を学ぶことに興味があるなら、それはおそらく価値があります。


また、EXPLAINは関連するクエリの数とタイプに関する情報を提供することも学びました(データベースのデバッグログよりもはるかに読みやすくなります)。
hegemon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.