Как я могу увидеть запрос после применения правил?

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

гегемон
источник

Ответы:

5

Не существует прямого способа увидеть представление переписанного запроса в SQL, потому что переписывание происходит во внутреннем древовидном представлении, и это непросто превратить обратно в SQL. Самым близким является включение параметра конфигурации debug_print_rewritten, который выводит представление этого внутреннего формата дерева в журнал сервера. Если вы используете это в сочетании с настройками debug_print_parseи debug_print_plan(и, возможно, debug_pretty_print), вы можете увидеть, как запрос трансформируется на разных этапах. Формат не легко читается, но если вы заинтересованы в изучении деталей этого, это, вероятно, того стоит.

Питер Айзентраут
источник
Я также узнал, что EXPLAIN дает информацию о количестве и типах запросов (и гораздо более читабелен, чем журнал отладки базы данных :).
гегемон