Jak mogę zobaczyć zapytanie po zastosowaniu reguł?

9

Z dokumentów - 37.3.1.1. „Pierwsza reguła krok po kroku”

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

Teraz ktoś:

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

Parser generuje to dodatkowe zapytanie

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

Pytanie brzmi: czy są jakieś narzędzia pozwalające określić, w jaki sposób zapytanie (1) zostaje przepisane na (1) + (2)?

hegemon
źródło

Odpowiedzi:

5

Nie ma bezpośredniego sposobu, aby zobaczyć reprezentację SQL przepisanego zapytania, ponieważ przepisywanie odbywa się na wewnętrznej reprezentacji drzewa i przekształcenie go z powrotem w SQL nie jest łatwe. Najbliższe jest włączenie parametru konfiguracyjnego debug_print_rewritten, który drukuje reprezentację tego wewnętrznego formatu drzewa w dzienniku serwera. Jeśli używasz tego w połączeniu z ustawieniami debug_print_parsei debug_print_plan(i ewentualnie debug_pretty_print), możesz zobaczyć, w jaki sposób zapytanie jest przekształcane na różnych etapach. Format nie jest łatwy do odczytania, ale jeśli chcesz poznać szczegóły na ten temat, prawdopodobnie warto.

Peter Eisentraut
źródło
Dowiedziałem się również, że EXPLAIN podaje informacje o liczbie i typach zapytań (i jest o wiele bardziej czytelny niż dziennik debugowania bazy danych :).
hegemon