Материализованное представление в Oracle 19c обновляется только при INSERT INTO, а не при UPDATE

Я создал базовое материализованное представление в своей базе данных OracleSQL (версия 19c), но, похоже, оно обновляется только при добавлении каждой новой строки, а не при обновлении существующей строки.

Это работает:

CREATE MATERIALIZED VIEW TEST1
            BUILD IMMEDIATE
    REFRESH FAST ON COMMIT
AS
SELECT ID,
       ARTICLE_ID,
       STOCK
FROM BOOKING
ORDER BY STOCK;

Новые строки И обновления существующих строк отслеживаются правильно. Однако следующее представление обновляется только при вставке целой строки:

CREATE MATERIALIZED VIEW TEST2
            BUILD IMMEDIATE
    REFRESH FAST ON COMMIT
AS
SELECT ID,
       ARTICLE_ID,
       SUM(STOCK) as STOCK
FROM BOOKING
GROUP BY ID, ARTICLE_ID
ORDER BY SUM(STOCK);

(Да, я знаю, что TEST2 технически бессмысленен, поскольку GROUP BY ID ничего не делает, но это был наименее инвазивный метод, который я смог найти, чтобы проверить, является ли SUM виновником.) ID — единственный первичный ключ таблицы BOOKING. Вот журнал материализованного представления, используемый обоими материализованными представлениями:

CREATE MATERIALIZED VIEW LOG ON BOOKING
    WITH ROWID, PRIMARY KEY, SEQUENCE (ARTICLE_ID,
                          STOCK)
    INCLUDING NEW VALUES;

Почему TEST2 не работает? Я начинаю чувствовать, что агрегатные функции здесь не работают по замыслу. Но это было бы странно, поскольку INSERT INTO, похоже, корректно отслеживается в TEST2. Плюс, я думаю, пересчитать что-то вроде СУММЫ, учитывая материализованный журнал просмотра, должно быть не так уж сложно, поскольку у вас уже есть дельта.

Обновлено: запуск EXPLAIN_MVIEW в этом материализованном представлении дал следующие результаты:

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
exec DBMS_MVIEW.EXPLAIN_MVIEW('TEST2' );

select * from MV_CAPABILITIES_TABLE ;

Объясню вам, почему... И

CREATE MATERIALIZED VIEW BOOKING_MV
    REFRESH FAST ON COMMIT
AS
SELECT 
    ARTICLE_ID, SUM(STOCK) as stk, COUNT(stock) as cs, COUNT(*) as c
FROM BOOKING
GROUP BY ARTICLE_ID
;

будет работать...

Обратите внимание, чтобы не искать определение в документе:

create table mv_capabilities_table (
   statement_id      varchar(30),
   mvowner           varchar(30),
   mvname            varchar(30),
   capability_name   varchar(30),
   possible          character(1),
   related_text      varchar(2000),
   related_num       number,
   msgno             integer,
   msgtxt            varchar(2000),
   seq               number
);

Каким-то образом добавление таблицы возможностей самостоятельно не сработало, но помог запуск сценария admin/utlxmv.sql. Я добавлю результаты в исходный пост, но я не могу их понять. Тем более, что причина неработоспособности REFRESH_FAST нулевая, лол.

Panossa 29.05.2024 15:21

Кроме того, почему вы вообще использовали COUNT(stock) и COUNT(*)? Я не понимаю, зачем нужно то и другое, но тем более зачем оба?

Panossa 29.05.2024 15:27

Потому что это то, что мне сказали сделать в представлении объяснения... и это тоже есть на вашем скриншоте...

p3consulting 29.05.2024 15:41

Не могли бы вы указать мне на какую-то документацию, из которой я смогу узнать, зачем это нужно? Я попробовал, вроде бы это решило мою проблему, но такое ощущение, что я трачу производительность на подсчет того, что мне не нужно.

Panossa 29.05.2024 16:15

Другие вопросы по теме