何时在实体化视图中添加一系列字段

When to add a sequence of fields in a materialized view

晚上好,

我试图了解在哪些情况下会使用序列,例如下面的示例,因为 rowid 不会总是给我一行来管理更改。

为什么要考虑一系列附加字段?

如果你能用一些例子澄清这个问题,我将不胜感激。

非常感谢,

你好。

CREATE MATERIALIZED VIEW LOG ON sales 
   WITH ROWID, SEQUENCE(amount_sold, time_id, prod_id)
   INCLUDING NEW VALUES; 

现在想象一下,您想要创建一个实体化视图,其中包含此 table 上的聚合。因为实体化视图日志是用实体化视图定义查询中的所有引用列创建的,所以实体化视图可以快速刷新。如果对销售应用 DML table,则更改会在发出提交时反映在物化视图中。

CREATE MATERIALIZED VIEW sum_sales
REFRESH FAST ON COMMIT AS  
SELECT s.time_id, COUNT(*) AS count_grp,
   SUM(s.amount_sold) AS sum_dollar_sales,
   COUNT(s.amount_sold) AS count_dollar_sales
FROM sales s
GROUP BY s.time_id;

不使用序列,会出现如下错误

ORA-12033: cannot use filter columns from materialized view log on "ADMIN"."SALES"

所以让我尝试通过使用 测试用例

来解释原因
drop table sales;
create table sales (time_id number, prod_id number, amount_sold number)
CREATE MATERIALIZED VIEW LOG ON sales 
   WITH ROWID, SEQUENCE(amount_sold, time_id, prod_id)
   INCLUDING NEW VALUES; 

truncate table sales;
insert into sales values (1,1,23);
insert into sales values (1,2,23);
commit;

select time_id, sum(amount_sold) from sales group by time_id;

TIME_ID SUM(AMOUNT_SOLD) 
------- ---------------- 
      1               46 

现在想象一下,您将多次修改一行。

update sales set amount_sold = 55 where time_id = 1 and PROD_ID = 1;
update sales set amount_sold = 12 where time_id = 1 and PROD_ID = 1;

select time_id, sum(amount_sold) from sales group by time_id;
TIME_ID SUM(AMOUNT_SOLD) 
------- ---------------- 
      1               35 

你的新 amount_sold 是 35。如何 快速刷新而不读取行 (1,2) 的值,因为你只修改了 (1, 1)

select * from MLOG$_SALES where DMLTYPE$$ != 'I' order by ;

AMOUNT_SOLD TIME_ID PROD_ID M_ROW$$            SEQUENCE$$ SNAPTIME$$           DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$            XID$$ 
----------- ------- ------- ------------------ ---------- -------------------- --------- --------- --------------- ---------------- 
         23       1       1 AAAwaSAAAAAAFpTAAA        105 4000-01-01T00:00:00Z U         U         CA==            4222223434942993 
         55       1       1 AAAwaSAAAAAAFpTAAA        106 4000-01-01T00:00:00Z U         N         CA==            4222223434942993 
         55       1       1 AAAwaSAAAAAAFpTAAA        107 4000-01-01T00:00:00Z U         U         CA==            4222223434942993 
         12       1       1 AAAwaSAAAAAAFpTAAA        108 4000-01-01T00:00:00Z U         N         CA==            4222223434942993 

因此您可以使用之前的值 46 和 increment/decrement 使用 old/new 值如下

select 46 - 23 + 55  - 55 + 12 as newval from dual;

NEWVAL 
------ 
    35 

删除时也可以这样做

只有 rowid 是不可能的。要生成新值 35,您需要读取一个未修改的值,因此您无法进行快速刷新。

希望这可以帮助您了解在哪些情况下使用序列