毎回同じ値を返すファンクションをチューニングする方法

ここでは、毎回同じ値を返すファンクションをチューニングする方法を紹介します。

例えば、毎回NULLを返したり、空白文字、決まった文字列を返したりするファンクションです。
そもそも、毎回同じ値を返すのに、わざわざファンクションにする必要ない気もしますが、現実には存在したりします。

しかも、そのファンクションが他のSQLのSELECT句で呼び出されていたりすると、データ1行ごとにそのファンクションが実行されることになるため、性能を悪化させる原因になったりします。

例えば、次のようなケースです。
SELECT句でファンクションが呼ばれています。table1のデータ1行ごとにファンクションが実行されることになります。

select
  ,a.col1
  ,PKG1.retNULL
  ,PKG1.retSPACE
from
  table1 a
;

毎回同じ値を返すのであれば、パッケージの仕様部でDETERMINISTICを付与してください。
これでオプティマイザに毎回同じ値を返すことを教えてあげます。そうすることで静的に同じ値が返ってくるようになり、高速になります。

CREATE OR REPLACE PACKAGE PKG1 AS
 FUNCTION retNULL() RETURN NULL DETERMINISTIC;

 FUNCTION retSPACE() RETURN VARCHAR2 DETERMINISTIC;

END;
/

ちなみに毎回同じ値が返ってこないけど、返り値をキャッシュさせたい場合はRESULT_CACHEを使うと良いそうです。使ったことないのでよくわかりませんが。

Oracle SQLチューニング パフォーマンス改善と事前対策に役立つ (DB selection) [ 加藤祥平 ]

価格:2,808円
(2018/11/19 19:23時点)