我的物化视图基础表有6M记录,并且每次都进行COMPLETE刷新。 MVIEW底层查询有18个表连接(所有表在同一模式中)。它每次刷新时都会阻塞PGA内存,我会收到警告。所以我的问题在下面。Oracle:物化视图vs存储过程在重新生成时的大数据方面
1)我应该将物化视图更改为存储过程吗?存储过程将使光标具有与Mview相同的查询,并且它将一次使用BULK COLLECT和LIMIT 1000行将数据加载到新表中。我们将编写一份Autosys作业(每天一次在非工作时间)致电该程序。
下面是我改变PROC:
CREATE OR REPLACE PROCEDURE proc_reporting IS
CURSOR cur_rows IS
(Old MVIEW query)
TYPE reporting_type IS TABLE OF reporting_test%ROWTYPE INDEX BY PLS_INTEGER;
l_reporting_type reporting_type;
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE reporting_test';
OPEN cur_rows;
LOOP
FETCH cur_rows BULK COLLECT INTO l_reporting_type LIMIT 1000;
EXIT WHEN l_reporting_type.count = 0;
BEGIN
FORALL i IN l_reporting_type.FIRST .. l_reporting_type.LAST SAVE EXCEPTIONS
INSERT INTO reporting_test VALUES (l_reporting_type(i).column_1 .. l_reporting_type(i).column_n);
EXCEPTION
WHEN ex_dml_errors THEN
l_error_count := SQL%BULK_EXCEPTIONS.count;
DBMS_OUTPUT.put_line('Number of failures: ' || l_error_count);
FOR i IN 1 .. l_error_count
LOOP
DBMS_OUTPUT.put_line('Error: ' || i ||
' Array Index: ' || SQL%BULK_EXCEPTIONS(i).error_index ||
' Message: ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
END LOOP;
END;
END LOOP;
CLOSE cur_rows;
END;
物化视图和存储过程是两个不同的东西。你是说你会使用存储过程将数据写入表中并使用该表而不是物化视图?很显然,一张表不支持查询重写,而MV则支持。理想情况下,您应该改变您的MV以启用增量刷新。 –
您是否运行[DBMS_MVIEW.EXPLAIN_MVIEW()](http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_mview.htm#CEGGEHHC)查看您是否可以调整视图以进行快速刷新? – APC
Hi @ Nick.McDermaid是的,我将使用存储过程将数据写入表并使用该表而不是物化视图。我目前的MV有DISABLE QUERY REWRITE,我们也不希望QUERY REWRITE成为ENABLE。我不能将MV更改为增量刷新,因为它具有UNION查询(选择A UNION SELECT B)。 – Wasim