Table des matières
QUERY_REWRITE_INTEGRITY
Maison base de données tutoriel mysql QUERY_REWRITE_INTEGRITY

QUERY_REWRITE_INTEGRITY

Jun 07, 2016 pm 03:56 PM
query rewrite

QUERY_REWRITE_INTEGRITY Property Description Parameter type String Syntax QUERY_REWRITE_INTEGRITY = { enforced | trusted | stale_tolerated } Default value enforced Modifiable ALTER SESSION, ALTER SYSTEM Real Application Clusters Multiple i

QUERY_REWRITE_INTEGRITY

Property Description
Parameter type String
Syntax QUERY_REWRITE_INTEGRITY = { enforced | trusted | stale_tolerated }
Default value enforced
Modifiable ALTER SESSION, ALTER 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 参数设置, 如果看出错误的步骤 欢迎指正。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment réorganiser plusieurs colonnes dans Power Query par glisser-déposer Comment réorganiser plusieurs colonnes dans Power Query par glisser-déposer Mar 14, 2024 am 10:55 AM

Dans cet article, nous allons vous montrer comment réorganiser plusieurs colonnes dans PowerQuery par glisser-déposer. Souvent, lors de l'importation de données provenant de diverses sources, les colonnes peuvent ne pas être dans l'ordre souhaité. La réorganisation des colonnes vous permet non seulement de les organiser dans un ordre logique adapté à vos besoins d'analyse ou de reporting, mais elle améliore également la lisibilité de vos données et accélère les tâches telles que le filtrage, le tri et l'exécution de calculs. Comment réorganiser plusieurs colonnes dans Excel ? Il existe de nombreuses façons de réorganiser les colonnes dans Excel. Vous pouvez simplement sélectionner l'en-tête de colonne et le faire glisser vers l'emplacement souhaité. Cependant, cette approche peut devenir fastidieuse lorsqu’il s’agit de grands tableaux comportant de nombreuses colonnes. Pour réorganiser les colonnes plus efficacement, vous pouvez utiliser l'éditeur de requête amélioré. Améliorer la requête

Plug-in de base de données React Query : comment importer et exporter des données Plug-in de base de données React Query : comment importer et exporter des données Sep 26, 2023 pm 05:37 PM

Plug-in de base de données ReactQuery : méthodes pour implémenter l'importation et l'exportation de données, des exemples de code spécifiques sont nécessaires. Avec l'application généralisée de ReactQuery dans le développement front-end, de plus en plus de développeurs commencent à l'utiliser pour gérer les données. Dans le développement réel, nous devons souvent exporter des données vers des fichiers locaux ou importer des données de fichiers locaux dans la base de données. Afin d'implémenter ces fonctions plus facilement, vous pouvez utiliser le plug-in de base de données ReactQuery. Le plugin de base de données ReactQuery fournit une série de méthodes

Comment la réécriture de Nginx implémente le saut d'URL Comment la réécriture de Nginx implémente le saut d'URL Jun 03, 2023 am 11:55 AM

Saut d'URL Le saut d'URL mentionné ici consiste à accéder à une autre URL lorsque l'utilisateur accède à une URL. Un scénario d'application courant consiste à laisser plusieurs noms de domaine accéder à la même URL (par exemple, laisser l'ancien nom de domaine accéder à un nouveau nom de domaine), à ​​transférer les requêtes de fichiers statiques vers CDN, etc. Accédez à différents sites en fonction de l'appareil utilisateur. (version PC), version wap), etc. Le saut d'URL peut être réalisé en définissant window.location sur la page avec js ou en définissant l'en-tête avec php. Bien sûr, il peut également être implémenté en utilisant la fonction de réécriture de nginx. Le module de réécriture nginxrewrite est le module de réécriture statique de nginx. . L'utilisation de base est rewritepattenre.

Comment configurer les règles de localisation et de réécriture dans Nginx Comment configurer les règles de localisation et de réécriture dans Nginx May 18, 2023 pm 12:25 PM

Exemple de didacticiel de localisation : location=/{#Correspondance exacte/, le nom d'hôte ne peut être suivi d'aucune chaîne [configurationA]}location/{#Parce que toutes les adresses commencent par /, cette règle correspondra à toutes les requêtes#Mais régulière et la chaîne la plus longue sera mis en correspondance en premier [configurationB]}location/documents/{#Match n'importe quelle adresse commençant par /documents/ Après la correspondance, continuez la recherche vers le bas#Uniquement lorsque l'expression régulière suivante ne correspond pas, cet article utilisera [configurationC]}location. ~/document

Comment diviser les données en NTFS à l'aide de Power Query Comment diviser les données en NTFS à l'aide de Power Query Mar 15, 2024 am 11:00 AM

Cet article explique comment utiliser PowerQuery pour diviser les données en lignes. Lors de l'exportation de données à partir d'autres systèmes ou sources, il est courant de rencontrer des situations dans lesquelles les données sont stockées dans des cellules combinant plusieurs valeurs. Avec PowerQuery, nous pouvons facilement diviser ces données en lignes, ce qui facilite leur traitement et leur analyse. Cela peut se produire si l'utilisateur ne comprend pas les règles d'Excel et saisit accidentellement plusieurs données dans une cellule, ou si les données ne sont pas formatées correctement lors d'un copier/coller à partir d'autres sources. Le traitement de ces données nécessite des étapes supplémentaires pour extraire et organiser les informations à des fins d'analyse ou de reporting. Comment diviser les données dans PowerQuery ? Les transformations PowerQuery peuvent être basées sur une variété de facteurs différents tels que le mot

Reconnaissance d'intention de requête basée sur l'amélioration des connaissances et un grand modèle pré-entraîné Reconnaissance d'intention de requête basée sur l'amélioration des connaissances et un grand modèle pré-entraîné May 19, 2023 pm 02:01 PM

1. Introduction générale La numérisation des entreprises est un sujet brûlant ces dernières années. Elle fait référence à l'utilisation de technologies numériques de nouvelle génération telles que l'intelligence artificielle, le big data et le cloud computing pour changer le modèle économique des entreprises, favorisant ainsi une nouvelle croissance de leur activité. . La numérisation des entreprises comprend généralement la numérisation des opérations commerciales et la numérisation de la gestion de l'entreprise. Ce partage introduit principalement la numérisation au niveau de la gestion de l'entreprise. La numérisation de l’information, en termes simples, signifie lire, écrire, stocker et transmettre des informations de manière numérique. Des anciens documents papier aux documents électroniques actuels et aux documents collaboratifs en ligne, la numérisation des informations est devenue la nouvelle norme dans les bureaux d'aujourd'hui. Actuellement, Alibaba utilise DingTalk Documents et Yuque Documents pour la collaboration commerciale, et le nombre de documents en ligne a atteint plus de 20 millions. De plus, de nombreuses entreprises

Quels sont les scénarios d'application du module Nginx Rewrite ? Quels sont les scénarios d'application du module Nginx Rewrite ? May 24, 2023 pm 03:52 PM

Scénario d'application 1 - Saut basé sur le nom de domaine L'ancien nom de domaine de l'entreprise doit être remplacé par le nouveau nom de domaine www.kgc.com en raison de l'évolution des besoins de l'entreprise 1. L'ancien nom de domaine ne peut pas être supprimé 2. Saut de l'ancien domaine nom au nouveau nom de domaine et conservez-le. Les paramètres restent inchangés et l'environnement de déploiement est un serveur Linux (192.168.142.130) et un hôte de test Windows71. Installez le service nginx [root@localhost~]#rpm-uvhhttp://nginx. .org/packages/centos/7/noarch/rpms/ nginx-release-centos-7-0.el7.ngx.noarch.rpm

Plugin de base de données React Query : stratégies de sauvegarde et de restauration des données Plugin de base de données React Query : stratégies de sauvegarde et de restauration des données Sep 28, 2023 pm 11:22 PM

Plug-in de base de données ReactQuery : stratégies pour mettre en œuvre la sauvegarde et la restauration des données, des exemples de code spécifiques sont nécessaires Introduction : Dans le développement Web moderne, la sauvegarde et la restauration des données sont une tâche très importante. Surtout lorsque nous utilisons des outils de gestion d'état comme ReactQuery, nous devons garantir la sécurité et la fiabilité des données. Cet article présentera un plug-in de base de données basé sur ReactQuery pour mettre en œuvre des stratégies de sauvegarde et de restauration des données, et fournira des exemples de code spécifiques. RéagirQu

See all articles