ホームページ >データベース >mysql チュートリアル >ORACLE は SPM を通じて SQL ステートメントに HINT を追加します
SPM を通じて実行計画が固定されている SQL は、DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE を通じて実現できます。この関数を使用して、元の SQL を変更せずに HINT を追加することで実行計画を修正することもできます。
DB バージョン: ORACLE 11.2.0.4
OS: CENTOS 6.6
例:
元の SQL インデックス:
SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
を追加してテーブル全体のスキャンを実行させたいヒント:
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
V$SQL のクエリ、元の SQL の SQL_ID=064qcdmgt6thw、HINT=ahdtbgvsd3bht の SQL の SQL_ID、 PLAN_HASH_VALUE=970476072。
以下を実行します:
DECLARE
CNT NUMBER;
V_SQL CLOB;
BEGIN
-- 元のステートメント SQL テキストを取得します
SELECT SQL_FULLTEXT INTO V_SQL FROM V$SQL WHERE SQL_ID = '064qcdmgt6thw' AND ROWNUM=1;
--Add元のステートメントの SQL を修正するための SQL の HINT SQL_ID と PLAN_HASH_VALUE
CNT := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID PLAN_HASH_VALUE => 970476072,
元のステートメントの HINT を使用して実行計画を修正します。元の文を実行し、V$SQLのPLAN_HASH_VALUE列およびSQL_PLAN_BASELINE列で修正されているかどうかを確認します。
テスト中に、バインド変数を含む一部の SQL では、定数 SQL の SQL_ID と PLAN_HASH_VALUE を修正できないことが判明しました。現時点では、EXECUTE IMMEDIATE を使用してバインド変数を含む SQL を生成することができます。
例:
DECLARE
V_SQL VARCHAR2(3000);
BEGIN
V_SQL := 'SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:1';
EXECUTE IMMEDIATE V_SQL
USING 10;
END;
or
var vnumber;
exec :v :=10
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:V;