Wie kann ich eine Abfrage sehen, nachdem Regeln angewendet wurden?

9

Aus Dokumenten - 37.3.1.1. "Eine erste Regel Schritt für Schritt"

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

Jetzt macht jemand:

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

Und der Parser generiert diese zusätzliche Abfrage

(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';

Die Frage ist: Gibt es Tools, mit denen festgestellt werden kann, wie die Abfrage (1) in (1) + (2) umgeschrieben wird?

Hegemon
quelle

Antworten:

5

Es gibt keine direkte Möglichkeit, eine SQL-Darstellung der umgeschriebenen Abfrage anzuzeigen, da das Umschreiben in einer internen Baumdarstellung erfolgt und es nicht einfach ist, diese wieder in SQL umzuwandeln. Am nächsten ist das Aktivieren des Konfigurationsparameters debug_print_rewritten, der eine Darstellung dieses internen Baumformats in das Serverprotokoll druckt. Wenn Sie dies in Verbindung mit den Einstellungen debug_print_parseund debug_print_plan(und möglicherweise debug_pretty_print) verwenden, können Sie sehen, wie die Abfrage in den verschiedenen Phasen transformiert wird. Das Format ist nicht leicht zu lesen, aber wenn Sie daran interessiert sind, die Details zu erfahren, wird es sich wahrscheinlich lohnen.

Peter Eisentraut
quelle
Ich habe auch erfahren, dass EXPLAIN Informationen über die Anzahl und Art der beteiligten Abfragen enthält (und weitaus besser lesbar ist als das Debug-Protokoll der Datenbank :).
Hegemon