翻訳者から:Habrへの旅は、独自のテキストを最初から作成するのではなく、古典的なPL / SQL開発のStephenFeuersteinによる比較的新鮮な(2020年8月17日からの)記事の翻訳から始めることにしました。 、ここでは、PL / SQL関数の結果キャッシュの2つの主要なバリアント間の十分な詳細の違いについて説明しています。この翻訳が、オラクルのテクノロジーを使い始める多くの開発者にとって役立つことを願っています。
前書き
遅かれ早かれ、経験豊富なOracle開発者は次のような質問をされます。
deterministicとresult_cacheの違いが正確に何であるかわかりません。それらには異なるユースケースがありますか?ルックアップテーブルからデータを取得する多くの関数で決定論を使用しています。決定論的ではなく、result_cacheキーワードを使用する必要がありますか?
これら2つの可能性の違いについて書く価値があると思いました。まず、関数が決定論的である場合について、私たち全員が同じように理解していることを確認しましょう。
ウィキペディアは、決定論的なアルゴリズムの以下の定義を提供します。
決定論的アルゴリズムは、同じ一連のアクションを実行しながら、同じ入力セットに対して同じ出力セットを返すアルゴリズムです。
言い換えると、決定論的サブルーチン(プロシージャまたは関数)には副作用がありません。特定の値のセットを入力パラメーターとして渡すことにより、このサブルーチンをいつ、どこで、またはどのくらいの頻度で呼び出すかに関係なく、出力で常に同じ結果が得られます。
合理的な質問は、PL / SQL関数の副作用は何ですか?少なくとも(リストは網羅的ではありません):
任意の(つまり、任意の)DML演算子
この関数の外部で宣言された変数(つまり、グローバル、スコープ外、別名「グローバル」)を使用する
非決定論的サブルーチンを呼び出す
, deterministic result_cache , . . ( result_cache), , , .
FUNCTION betwnstr (
string_in IN VARCHAR2
, start_in IN INTEGER
, end_in IN INTEGER
)
RETURN VARCHAR2 DETERMINISTIC
IS
BEGIN
RETURN (SUBSTR (string_in, start_in, end_in - start_in + 1));
END;
- substr
, , . , , .
, Oracle Database , DETERMINISTIC
( ).
?
,
( )
, :
CREATE OR REPLACE FUNCTION pass_number (i NUMBER)
RETURN NUMBER
DETERMINISTIC
IS
BEGIN
DBMS_OUTPUT.put_line ('pass_number executed');
RETURN 0;
END;
/
DECLARE
n NUMBER := 0;
BEGIN
FOR rec IN (SELECT pass_number (1)
FROM all_objects
WHERE ROWNUM < 6)
LOOP
n := n + 1;
END LOOP;
DBMS_OUTPUT.put_line (n + 1);
END;
/
pass_number executed
6
, , 5 , . Oracle Database , ( PL/SQL SQL-, ).
, result_cache
betwnstr
, result_cache:
FUNCTION betwnstr (
string_in IN VARCHAR2
, start_in IN INTEGER
, end_in IN INTEGER
)
RETURN VARCHAR2
RESULT_CACHE
IS
BEGIN
RETURN (SUBSTR (string_in, start_in, end_in - start_in + 1));
END;
- RESULT_CACHE
. , DETERMINISTIC
, . , result_cache.
result_cache? :
Oracle Database, SGA (Shared Global Area)
, ,
( "" )
( Oracle - , references) , commit
, . RESULT_CACHE
- "" DETERMINISTIC
( , ) . RESULT_CACHE
, . RESULT_CACHE
Oracle Live SQL.
, , RESULT_CACHE
:
CREATE OR REPLACE FUNCTION pass_number (i NUMBER)
RETURN NUMBER
RESULT_CACHE
IS
BEGIN
DBMS_OUTPUT.put_line ('pass_number executed for ' || i);
RETURN 0;
END;
/
DECLARE
n NUMBER := 0;
BEGIN
FOR rec IN (SELECT pass_number (100)
FROM all_objects
WHERE ROWNUM < 6)
LOOP
n := n + 1;
END LOOP;
DBMS_OUTPUT.put_line ('All done ' || TO_CHAR (n + 1));
END;
/
pass_number executed for 100
All done 6
BEGIN
DBMS_OUTPUT.PUT_LINE ('Returned ' || pass_number (100));
DBMS_OUTPUT.PUT_LINE ('Returned ' || pass_number (200));
DBMS_OUTPUT.PUT_LINE ('Returned ' || pass_number (300));
DBMS_OUTPUT.PUT_LINE ('Returned ' || pass_number (100));
DBMS_OUTPUT.PUT_LINE ('Returned ' || pass_number (200));
DBMS_OUTPUT.PUT_LINE ('Returned ' || pass_number (300));
END;
/
Returned 0
pass_number executed for 200
Returned 0
pass_number executed for 300
Returned 0
Returned 0
Returned 0
Returned 0
100 ( ), , , .
200 300 - , .
! ( ) PL/SQL , :
All done 6
Returned 0
Returned 0
Returned 0
Returned 0
Returned 0
Returned 0
, RESULT_CACHE
, , . , - - .
: , result_cache, , .
deterministic result_cache?
DETERMINISTIC
RESULT_CACHE
.
?
, , DETERMINISTIC
, ( ) ( SQL-, ). , , .
, , , RESULT_CACHE
, (instance) , ( , ) . , .
?
: DETERMINISTIC
, .
PL/SQL SQL, , (, ).
, . , , .
DETERMINISTIC
, . Oracle , , .
, result_cache?
. RESULT_CACHE
. DBA, , . , SGA , (latch contention).
, result_cache. :
?
, ? ,
, , , ? , ,
- , NLS? , , , ,
TO_CHAR
.
: RESULT_CACHE
, , , .