Oracle:決定論的関数、result_cacheおよび演算子

Oracleの記事を翻訳した後 Steven Feuersteinのdeterministicとresult_cacheの違いについて、デバイスの非常に重要な詳細を補足したいと思います。これらのトピックに関する一連の記事がありますが、ここではすべてを要約し、最も重要なものを残しておきたいと思います。





1. PL / SQL関数のクエリは、それらを呼び出すクエリ自体と一致していません

実際のところ、関数内のリクエストは、呼び出し元のリクエストではなく、起動時にデータ(一貫性/一貫性)を「参照」します。また、関数自体がどのように定義されていても、クエリのWITH句で宣言された関数でも、同じ方法で一貫性のないデータを受け取ります。つまり、メインリクエストの開始から関数内のリクエストまでの間にデータが変更された場合、関数は他のデータを返します。ここここの





このことから、関数内にクエリを含めるべきではないこと、またはそのためのSQL演算子を作成する必要があることは明らかです。たとえば、f1関数のf1_op演算子は次のとおりです。





CREATE OPERATOR f1_op
   BINDING (INT) 
   RETURN INT
   USING F1;
      
      



さらに、SQLマクロはOracle 21に正式に登場します。まだかなりバグがありますが、将来的には多くの場合、関数を放棄できるようになります。これにより、コンテキストスイッチの削減によるパフォーマンスの向上と、データの整合性からの保護が実現します。問題。





2.リクエストの変換により、関数呼び出しの数が増える可能性があります

次のような単純なクエリについて考えてみます。





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.
*/
      
      



xf関数は何回実行されると思いますか?





答えは、オプティマイザーがどのように機能するかによって異なります。サブクエリがマージされるかどうか、およびフィルタープッシュダウンが発生するかどうかです。プランの例:





--------------------------------------------------
-- 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]
      
      



詳細





3.SQLでの決定論的関数のキャッシュ

3.1決定論的関数のキャッシングでは、ハッシュテーブルと関数、およびスカラーサブクエリキャッシングを使用します

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 :





  1. PLSQL_OPTIMIZE_LEVEL



    >= 2









  2. (implicit conversions)





  3. -"" ( 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.








All Articles