------------------- -------- ---------------------------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) TYGER@ORCL>alter table emp 2 add constraint emp_fk_dept 3 foreign key(deptno) references dept(deptno); Table altered. TYGER@ORCL>alter table emp modify deptno not null; Table altered. TYGER@ORCL>desc emp; Name Null? Type ----------------------------------------- -------- ---------------------------- EMPNO NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2) TYGER@ORCL>set autot traceonly explain TYGER@ORCL>select count(*) from emp; COUNT(*) ---------- 14 Execution Plan ---------------------------------------------------------- Plan hash value: 155013515 -------------------------------------------------------------------------------- ---------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- ---------- | 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 13 | | | | 2 | MAT_VIEW REWRITE ACCESS FULL| EMP_DEPT | 3 | 39 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------------- ---------- Note ----- - dynamic sampling used for this statement 可见 当我们将完整性约束全部添加后,优化器有了足够的信息知道这条语句通过物化视图可以查询重写,而不用查询基表,实际的执行情况也印证了这一点。 我们在通过一个例子说明 THUSTED 的情况。我们首先将这些约束去除掉,然后添加一行新的数据 TYGER@ORCL>alter table emp drop constraint emp_fk_dept; Table altered. TYGER@ORCL>alter table dept drop constraint dept_pk; Table altered. TYGER@ORCL>alter table emp modify deptno null; Table altered. TYGER@ORCL>desc dept Name Null? Type ----------------------------------------- -------- ---------------------------- DEPTNO NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) TYGER@ORCL>desc emp; Name Null? Type ----------------------------------------- -------- ---------------------------- EMPNO NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) // 插入一条违反实际约束行 TYGER@ORCL>insert into emp(empno,deptno) values(1,1); 1 row created. TYGER@ORCL>exec dbms_mview.refresh('EMP_DEPT'); PL/SQL procedure successfully completed. TYGER@ORCL>alter materialized view emp_dept consider fresh; alter materialized view emp_dept consider fresh * ERROR at line 1: ORA-30374: materialized view is already fresh // 创建一个 novalidate 的约束 TYGER@ORCL>alter table dept 2 add constraint dept_pk primary key(deptno) 3 rely enable novalidate 4 / Table altered. TYGER@ORCL>alter table emp 2 add constraint emp_fk_dept 3 foreign key(deptno) references dept(deptno) 4 rely enable novalidate 5 / Table altered. TYGER@ORCL>alter table emp modify deptno not null novalidate; Table altered. 回到原来的查询,假如 query_rewrite_integrity = enforced 的话,那么我们知道由于上述约束实际上是违反真实数据约束的,因此优化器将不会利用物化视图查询重写。 TYGER@ORCL>show parameter query NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ query_rewrite_enabled string TRUE query_rewrite_integrity string enforced TYGER@ORCL> TYGER@ORCL>set autot traceonly explain TYGER@ORCL>select count(*) from emp; COUNT(*) ---------- 16 Execution Plan ---------------------------------------------------------- Plan hash value: 2083865914 ------------------------------------------------------------------- | Id | Operat |