应用规则后如何查看查询?

heg*_*mon 9 postgresql

来自文档- 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
                                );
Run Code Online (Sandbox Code Playgroud)

现在有人这样做:

(1) UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';
Run Code Online (Sandbox Code Playgroud)

解析器生成这个额外的查询

(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';
Run Code Online (Sandbox Code Playgroud)

问题是:是否有任何工具可以说明查询 (1) 如何被重写为 (1) + (2)?

Pet*_*aut 5

没有直接的方法可以查看重写查询的 SQL 表示,因为重写发生在内部树表示上,并且不容易将其转换回 SQL。最接近的是打开配置参数debug_print_rewritten,它将内部树格式的表示打印到服务器日志。如果您将它与设置debug_print_parsedebug_print_plan(可能还有debug_pretty_print)结合使用,您可以看到查询是如何通过各个阶段转换的。该格式不容易阅读,但如果您有兴趣了解其中的细节,那么这可能是值得的。