Я создал базовое материализованное представление в своей базе данных 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 в этом материализованном представлении дал следующие результаты:


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
);
Кроме того, почему вы вообще использовали COUNT(stock) и COUNT(*)? Я не понимаю, зачем нужно то и другое, но тем более зачем оба?
Потому что это то, что мне сказали сделать в представлении объяснения... и это тоже есть на вашем скриншоте...
Не могли бы вы указать мне на какую-то документацию, из которой я смогу узнать, зачем это нужно? Я попробовал, вроде бы это решило мою проблему, но такое ощущение, что я трачу производительность на подсчет того, что мне не нужно.
Каким-то образом добавление таблицы возможностей самостоятельно не сработало, но помог запуск сценария admin/utlxmv.sql. Я добавлю результаты в исходный пост, но я не могу их понять. Тем более, что причина неработоспособности REFRESH_FAST нулевая, лол.