Après avoir traduit l'article d' Oracle: la différence entre deterministic et result_cache de Steven Feuerstein, je voudrais le compléter avec des détails vraiment importants sur leur appareil. J'ai une série d'articles sur ces sujets, mais ici je voudrais juste tout résumer et laisser le plus important.
1. Les requêtes dans les fonctions PL / SQL ne sont pas cohérentes avec la requête elle-même qui les appelle
Le fait est que les requêtes à l'intérieur d'une fonction "voient" les données (cohérentes / cohérentes) au moment de leur lancement, et non la requête de l'appelant. Et quelle que soit la manière dont la fonction elle-même est définie, même la fonction déclarée dans la clause WITH de la requête recevra des données incohérentes de la même manière. Autrement dit, si les données ont changé pendant l'intervalle entre le début de la demande principale et la demande à l'intérieur de la fonction, la fonction renverra d'autres données. Exemples ici et ici .
À partir de là, il est évident que soit les fonctions ne doivent pas contenir de requêtes à l'intérieur, soit vous devez créer un opérateur SQL pour cela, par exemple: l'opérateur f1_op pour la fonction f1:
CREATE OPERATOR f1_op
BINDING (INT)
RETURN INT
USING F1;
De plus, les macros SQL apparaissent officiellement dans Oracle 21: elles sont encore assez boguées, mais à l'avenir elles vous permettront d'abandonner des fonctions dans de nombreux cas, ce qui donnera à la fois des gains de performances grâce à des changements de contexte réduits et vous évitera la cohérence des données. problèmes.
2. Le nombre d'appels de fonction peut être plus dû à la transformation de la demande
Considérez une requête simple comme celle-ci:
select *
from (
select xf(t10.id) a
from t10
)
where a*a >= 25;
-- t10:
/*
SQL> select id from t10;
ID
----------
1
2
3
4
5
6
7
8
9
10
10 rows selected.
*/
Combien de fois pensez-vous que la fonction xf sera exécutée?
La réponse dépend du fonctionnement de l'optimiseur: si la sous-requête sera fusionnée ou non, et si un filtre pushdown aura lieu: exemples de plans:
--------------------------------------------------
-- Plan 1:
Plan hash value: 2919944937
--------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
--------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 |
|* 1 | TABLE ACCESS FULL| T10 | 1 | 3 |
--------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("XF"("T10"."ID")*"XF"("T10"."ID")>=25)
--------------------------------------------------
-- Plan 2:
Plan hash value: 2027387203
---------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
---------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 |
| 1 | VIEW | | 1 | 13 |
|* 2 | TABLE ACCESS FULL| T10 | 1 | 3 |
---------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("XF"("T10"."ID")*"XF"("T10"."ID")>=25)
---------------------------------------------------
-- Plan 3:
---------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
---------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 |
|* 1 | VIEW | | 1 | 13 |
| 2 | TABLE ACCESS FULL| T10 | 1 | 3 |
---------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("A"*"A">=25)
Column Projection Information
------------------------------
1 - "A"[NUMBER,22]
2 - "A"[NUMBER,22]
Plus de détails
3. Mise en cache des fonctions déterministes dans SQL
3.1 La mise en cache des fonctions déterministes utilise des tables et des fonctions de hachage ainsi que la mise en cache de sous-requêtes scalaires
Scalar Subquery Caching( SSC) Deterministic Functions Caching , , hash-.
3.2 fetch-call'a
, fetch size (arraysize sql*plus) Fetch call . : -. SSC . , SSC : hash-.
3.3 - "_query_execution_cache_max_size"
SSC.
3.4 -
"_plsql_minimum_cache_hit_percent". SSC : - , , .
:
http://orasql.org/2013/02/10/deterministic-function-vs-scalar-subquery-caching-part-1/
http://orasql.org/2013/02/11/deterministic-function-vs-scalar-subquery-caching-part-2/
http://orasql.org/2013/02/11/deterministic-function-vs-scalar-subquery-caching-part-3/
deterministic + result cache, operator + deterministic + result cache:
http://orasql.org/2014/03/31/deterministic-functions-result_cache-and-operators/
4. deterministic PL/SQL
deterministic :
PLSQL_OPTIMIZE_LEVEL
>= 2
(implicit conversions)
-"" ( to_date, to_char, nvl)
5. Result cache
SSC and Deterministic functions caching, CGA, Result cache - shared cache ( shared pool), . Fine-grained dependency tracking c (, ), (RC latches). v$result_cache_objects
(type=dependency) v$result_cache_dependency
. "" ( ), select for update c . . "".
Result Cache , deterministic , deterministic, RC, . , SQL Macro 5-10.