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


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)?

Answers:


5

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


我还了解到EXPLAIN提供有关所涉及查询的数量和类型的信息(并且比数据库的调试日志更具可读性:)。
hegemon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.