動的クエリ文字列を作成して実行するこのストアド プロシージャがあります。SP は開発およびテスト環境では問題なく動作しますが、クライアント企業の DBA は、このクエリが本番環境のデータベースに非常に大きな打撃を与えていると報告しています。IT 部門からクエリの調整を依頼されました。これまでのところ、この SP のほとんどすべてを、クエリ文字列を動的に構築することから、(古いクエリと比較して) 非常に高速に実行される単一の大きなクエリに移動しました。
パラメータにデフォルト値または実際の値があるかどうかを評価することにより、sp がクエリ文字列の where 句を作成することを (とりわけ) 発見しました。
IF P_WORKFLOWSTATUS <> 0 THEN
L_SQL := TRIM(L_SQL) || ' AND WORKFLOW.STATUS = ' || TO_CHAR(P_WORKFLOWSTATUS);
END IF;
したがって、この動作を次のように最適化しました。
WHERE
...
AND (WORKFLOW.STATUS = P_WORKFLOWSTATUS OR P_WORKFLOWSTATUS = 0)
この種の変更により、数値列に影響を与えていたクエリが改善されましたが、VARCHAR2 パラメータと列に問題があることがわかりました。現在の挙動は
--CLIENT.CODE is a VARCHAR2(14) column and there is an unique index for this column.
--The data stored in this field is like 'N0002077123', 'E0006015987' and similar
IF NVL(P_CLIENT_CODE, '') <> '' THEN
L_SQL := TRIM(L_SQL) || ' AND CLIENT.CODE = ''' || P_CLIENT_CODE || '''';
END IF;
実行して、これを最適化されたバージョンのクエリに変更しようとしました
WHERE
...
AND (CLIENT.CODE = P_CLIENT_CODE OR NVL(P_CLIENT_CODE, '') = '')
しかし、この変更により、クエリのパフォーマンスが低下しました。VARCHAR2
クエリのこの部分を最適化する方法はありますか? または、このパラメーターを where 句に追加する必要があるかどうかを評価するためだけに、大きなクエリを動的クエリに (再び) 変換する必要がありますか?
前もって感謝します。