2017年02月22日

oracleのユーザー定義関数のDETERMINISTICオプションの有無をテストしようとして分かったのは、sysdate とか sysTimestamp は DETERMINISTIC な関数と同じように動くということ。

オラクルで、ファンクションを作っているときにパフォーマンスに効くだろうと思い。DETERMINISTIC オプションについて検証していました。
参考:
ファンクションの宣言および定義

意味:
DETERMINISTIC

同じパラメータ値を使用してファンクションが起動されたときは常に同じ値を戻すことをオプティマイザに示します(この前提が真でない場合は、DETERMINISTICを指定すると予測できない結果になります)。以前に同じパラメータ値を使用してファンクションが起動されている場合、オプティマイザは再度ファンクションを起動するかわりに以前の結果を使用できます。


「同じパラメータ値を使用してファンクションが起動されたときは常に同じ値を戻す」というのがいったいどの範囲で「常に」「同じ」なのかがずっと気になっていて
今回テストファンクションを書いたらなんとなく理解できた。
結論としては
「同じ1回のクエリー呼び出しの中で」
「クエリの特定の場所に記述された同一のパラメータ(もしくはパラメータなし)で呼び出された関数はクエリー中で何度呼び出しされても同じ値を返す」

たとえばこんな関数と
CREATE OR REPLACE FUNCTION SYSDATE_TEST
RETURN TIMESTAMP
PARALLEL_ENABLE
DETERMINISTIC
AS
BEGIN
RETURN systimestamp;
END;

もう一つこんな関数
CREATE OR REPLACE FUNCTION SYSDATE_TEST2
RETURN TIMESTAMP
PARALLEL_ENABLE
AS
BEGIN
RETURN systimestamp;
END;

を作って
以下のようなクエリーで呼び出してみよう
select
TO_CHAR(SYSDATE_TEST,'HH24:MI:SS.FF7') AS fncTS_D -- 関数の中でsysTimestampをDETERMINISTIC 呼び出し。

,TO_CHAR(SYSDATE_TEST2,'HH24:MI:SS.FF7') AS fncTS_N -- 関数の中でsysTimestampを 非DETERMINISTIC呼び出し

,TO_CHAR(systimestamp,'HH24:MI:SS.FF7') AS sysTS -- sysTimestamp をそのまま呼び出し
from scott.emp cross join scott.emp;

emp 表をcross ジョインしているのは 手ごろなサイズ(100レコード程度)のテーブルを作りたかったから。

結果は以下の通り。

2017-02-22_195010.png

systimestamp 自体は DETERMINISTIC で動いているのかそうでないのかよくわからなくなってしまった。

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/178868652
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

・おすすめ楽天ショップ1:trendyimpact楽天市場店
・おすすめサプリショップ:iHerb.com
・おすすめ楽天ショップ2:上海問屋
Powered by さくらのブログ