我在 Oracle (21c) 上尝试创建具有几何字段的物化视图时收到以下错误:
ORA-12015: cannot create a fast refresh materialized view from a complex query
我会在这里留下一些片段来重现这个错误。
首先,我们需要创建两个简单的表及其日志:
CREATE TABLE signos.lookup_table (
objectid NUMBER (38) NOT NULL,
table_rowid rowid NOT NULL
);
CREATE TABLE signos.dirty_table (
objectid NUMBER (38) NOT NULL,
shape MDSYS.GEOMETRY
);
CREATE MATERIALIZED VIEW LOG ON signos.lookup_table WITH ROWID INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG ON signos.dirty_table WITH ROWID INCLUDING NEW VALUES;
这应该有效,因为我们从物化视图查询中省略了几何字段:
CREATE MATERIALIZED VIEW signos.mv_filtered REFRESH FAST ON
DEMAND WITH ROWID AS
SELECT
dt.objectid,
dt.rowid AS dt_rowid,
lt.rowid AS lt_rowid
FROM
signos.dirty_table dt,
signos.lookup_table lt
WHERE
lt.table_rowid (+) = dt.rowid
AND lt.table_rowid IS NULL;
不幸的是,我们不能对这个说同样的话:
CREATE MATERIALIZED VIEW signos.mv_filtered REFRESH FAST ON
DEMAND WITH ROWID AS
SELECT
dt.objectid,
dt.shape, -- !!!
dt.rowid AS dt_rowid,
lt.rowid AS lt_rowid
FROM
signos.dirty_table dt,
signos.lookup_table lt
WHERE
lt.table_rowid (+) = dt.rowid
AND lt.table_rowid IS NULL;
返回上述错误:
ORA-12015: cannot create a fast refresh materialized view from a complex query
我不确定是否会出现此错误,关于此主题的文档不多。这些物化视图的生产版本将有多达 800 万条记录,因此快速刷新将对我的用例派上用场。也就是说,任何帮助将不胜感激。
编辑 1
感谢@mustaccio 指出 Oracle 关于该主题的文档。我按照建议删除了连接:
CREATE MATERIALIZED VIEW signos.mv_filtered REFRESH FAST ON
DEMAND WITH ROWID AS
SELECT
dt.rowid,
dt.objectid,
dt.shape
FROM
signos.dirty_table dt;
我得到了一个不同的错误:
ORA-30373: object data types are not supported in this context
TIA
手册是这样说的:
您可以在这里找到答案:
创建包含 ST_Geometry 的物化视图时出现 ORA-30373(文档 ID 1067173.1)
MDSYS.GEOMETRY (ST_GEOMETRY) 对象类型未定义为 FINAL。
ST_GEOMETRY 不能定义为 FINAL,因为它是如何设计的。
但是对象类型必须定义为 FINAL 才能在物化视图中引用。