• QUERY_REWRITE_INTEGRITY


    QUERY_REWRITE_INTEGRITY

    Property Description
    Parameter type String
    Syntax QUERY_REWRITE_INTEGRITY = { enforced | trusted | stale_tolerated }
    Default value enforced
    Modifiable ALTER SESSIONALTER SYSTEM
    Real Application Clusters Multiple instances can have different values.

    QUERY_REWRITE_INTEGRITY determines the degree to which Oracle must enforce query rewriting. At the safest level, Oracle does not use query rewrite transformations that rely on unenforced relationships.

    Values:

    • enforced

      Oracle enforces and guarantees consistency and integrity.

    • trusted

      Oracle allows rewrites using relationships that have been declared, but that are not enforced by Oracle.

    • stale_tolerated

      Oracle allows rewrites using unenforced relationships. Materialized views are eligible for rewrite even if they are known to be inconsistent with the underlying detail data.



      实验:
        TOM书上的样例,我自己做一些实验 大家一起理解
        
      首先我设置 QUERY_REWRITE_INTEGRITY = ENFORCED




      TYGER@ORCL>create table emp as select * from scott.emp;


      Table created.


      TYGER@ORCL>create table dept as select * from scott.dept;


      Table created.




      TYGER@ORCL>show parameter query


      NAME                                 TYPE        VALUE
      ------------------------------------ ----------- ------------------------------
      query_rewrite_enabled                string      TRUE
      query_rewrite_integrity              string      enforced
      TYGER@ORCL>
      TYGER@ORCL>create materialized view emp_dept
        2  build immediate
        3  refresh on demand
        4  enable query rewrite
        5  as 
        6     select dept.deptno,dept.dname,count(*)
        7     from emp,dept
        8     where emp.deptno=dept.deptno
        9     group by dept.deptno,dept.dname
       10  /


      Materialized view created.


      TYGER@ORCL>show parameter optimizer


      NAME                                 TYPE        VALUE
      ------------------------------------ ----------- ------------------------------
      optimizer_dynamic_sampling           integer     2
      optimizer_features_enable            string      10.2.0.1
      optimizer_index_caching              integer     0
      optimizer_index_cost_adj             integer     100
      optimizer_mode                       string      ALL_ROWS
      optimizer_secure_view_merging        boolean     TRUE
      TYGER@ORCL>set autot traceonly explain
      TYGER@ORCL>select count(*) from emp;


        COUNT(*)
      ----------
              14




      Execution Plan
      ----------------------------------------------------------
      Plan hash value: 2083865914


      -------------------------------------------------------------------
      | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
      -------------------------------------------------------------------
      |   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
      |   1 |  SORT AGGREGATE    |      |     1 |            |          |
      |   2 |   TABLE ACCESS FULL| EMP  |    14 |     3   (0)| 00:00:01 |
      -------------------------------------------------------------------


      Note
      -----
         - dynamic sampling used for this statement




       
      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>desc dept
       Name                                      Null?

         Type
       ----------------------------------------- -------- ----------------------------
       DEPTNO                                             NUMBER(2)
       DNAME                                              VARCHAR2(14)
       LOC                                                VARCHAR2(13)


      总结: 之所以发生这样的情况是因为知道 DEPTNO 是 DEPT 表的主键。DEPTNO 在表 EMP 中应该是 NOT NULL 的,EMP 表的 DEPTNO 应该是基于 DEPT 表 DEPTNO 列的外键,可是因为我们的表没有这个外键约束存在。而 query_rewrite_integrity 又设置为 enforced ,优化器为了得到完整可靠的数据不得不查询基表而得出终于结果。




      假如我们加上上面的规则。再看查询结果:


      TYGER@ORCL>alter table dept add constraint dept_pk primary key(deptno);


      Table altered.


      TYGER@ORCL>desc dept
       Name                                      Null?    Type
       ----------------------------------------- -------- ----------------------------
       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  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
      -------------------------------------------------------------------
      |   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
      |   1 |  SORT AGGREGATE    |      |     1 |            |          |
      |   2 |   TABLE ACCESS FULL| EMP  |    16 |     3   (0)| 00:00:01 |
      -------------------------------------------------------------------


      Note
      -----
         - dynamic sampling used for this statement




      而假设设置 query_rewrite_integrity = trusted 的话,那么优化器由于有了我们上述那个 novalidate约束的误导。它并不真实检验数据的完整性,因此还将会利用物化视图查询重写,虽然这样得出的结果是错误的。

      仅仅要我们让优化器知道有完整性约束的存在。无论约束严格与否,优化器仅仅要为了这个信息就会尽可能地利用物化视图查询重写。


      TYGER@ORCL>alter session set query_rewrite_integrity=trusted;


      Session altered.


      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


      而 stale_tolerated 就简单了:   


      /* 结果 我自己做实验却没有得到的想要的结果: */


      TYGER@ORCL>show parameter query


      NAME                                 TYPE        VALUE
      ------------------------------------ ----------- ------------------------------
      query_rewrite_enabled                string      TRUE
      query_rewrite_integrity              string      enforced


      // session 级别改动參数


      TYGER@ORCL>alter session set query_rewrite_integrity=stale_tolerated;


      Session altered.


      TYGER@ORCL>show parameter query


      NAME                                 TYPE        VALUE
      ------------------------------------ ----------- ------------------------------
      query_rewrite_enabled                string      TRUE
      query_rewrite_integrity              string      STALE_TOLERATED
      TYGER@ORCL>set autot traceonly explain;
      TYGER@ORCL>select count(*) from emp;


      Execution Plan
      ----------------------------------------------------------
      Plan hash value: 2083865914


      -------------------------------------------------------------------
      | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
      -------------------------------------------------------------------
      |   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
      |   1 |  SORT AGGREGATE    |      |     1 |            |          |
      |   2 |   TABLE ACCESS FULL| EMP  |    14 |     3   (0)| 00:00:01 |
      -------------------------------------------------------------------


      Note
      -----
         - dynamic sampling used for this statement


         // system 级别改动參数  仍然如此
         
      TYGER@ORCL>alter system set query_rewrite_integrity=stale_tolerated;


      System altered.


      TYGER@ORCL>set autot traceonly explain;
      TYGER@ORCL>select count(*) from emp;


      Execution Plan
      ----------------------------------------------------------
      Plan hash value: 2083865914


      -------------------------------------------------------------------
      | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
      -------------------------------------------------------------------
      |   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
      |   1 |  SORT AGGREGATE    |      |     1 |            |          |
      |   2 |   TABLE ACCESS FULL| EMP  |    14 |     3   (0)| 00:00:01 |
      -------------------------------------------------------------------


      Note
      -----
         - dynamic sampling used for this statement


       // 又一次启动数据库     结果依然
       
      TYGER@ORCL>conn / as sysdba
      Connected.
      SYS@ORCL>shutdown immediate
      Database closed.
      Database dismounted.
      ORACLE instance shut down.
      SYS@ORCL>startup
      ORACLE instance started.


      Total System Global Area  285212672 bytes
      Fixed Size                  1218992 bytes
      Variable Size              71304784 bytes
      Database Buffers          209715200 bytes
      Redo Buffers                2973696 bytes
      Database mounted.
      Database opened.
      SYS@ORCL>conn tyger/tyger
      Connected.
      TYGER@ORCL>show parameter query


      NAME                                 TYPE        VALUE
      ------------------------------------ ----------- ------------------------------
      query_rewrite_enabled                string      TRUE
      query_rewrite_integrity              string      STALE_TOLERATED
      TYGER@ORCL>set autot traceonly explain
      TYGER@ORCL>select count(*) from emp;


      Execution Plan
      ----------------------------------------------------------
      Plan hash value: 2083865914


      -------------------------------------------------------------------
      | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
      -------------------------------------------------------------------
      |   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
      |   1 |  SORT AGGREGATE    |      |     1 |            |          |
      |   2 |   TABLE ACCESS FULL| EMP  |    14 |     3   (0)| 00:00:01 |
      -------------------------------------------------------------------


      Note
      -----
         - dynamic sampling used for this statement




      尽管结果有点不是非常惬意,可是看完后基本能够了解  query_rewrite_integrity 这个參数了吧 




      遗留问题:356 行 stale_tolerated 參数设置。    假设看出错误的步骤 欢迎指正。



  • 相关阅读:
    PHP strcmp,strnatcmp,strncmp函数的区别
    PHP echo,print_r(expression),var_dump(expression)区别
    PHP包含文件语句include和require的区别
    PHP魔术变量__METHOD__,__FUNCTION__的区别
    解决margin重叠的问题
    冒牌、选择、插入排序算法
    == 和 === 的区别
    Javascript常见浏览器兼容问题
    浏览器常见兼容性问题汇总
    JS中replace()用法举例
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6884837.html
Copyright © 2020-2023  润新知