Як я бачу запит після застосування правил?


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 надає інформацію про кількість та тип запитів, що займаються (і це набагато читабельніше, ніж журнал налагодження бази даних :).
гегемон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.