Comment puis-je voir une requête après l'application des règles?

9

De la documentation - 37.3.1.1. "Une première règle étape par étape"

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

Maintenant, quelqu'un fait:

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

Et l'analyseur génère cette requête supplémentaire

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

La question est: existe-t-il des outils pour dire comment la requête (1) est réécrite en (1) + (2)?

Hégémon
la source

Réponses:

5

Il n'y a aucun moyen direct de voir une représentation SQL de la requête réécrite, car la réécriture se produit sur une représentation d'arborescence interne, et il n'est pas facile de la reconvertir en SQL. Le plus proche est d'activer le paramètre de configuration debug_print_rewritten, qui imprime une représentation de ce format d'arborescence interne dans le journal du serveur. Si vous l'utilisez conjointement avec les paramètres debug_print_parseet debug_print_plan(et éventuellement debug_pretty_print), vous pouvez voir comment la requête est transformée à travers les différentes étapes. Le format n'est pas facile à lire, mais si vous êtes intéressé à en apprendre les détails, cela en vaudra probablement la peine.

Peter Eisentraut
la source
J'ai également appris qu'EXPLAIN donne des informations sur le nombre et le type de requêtes impliquées (et est beaucoup plus lisible que le journal de débogage de la base de données :).
hegemon