ホームページ  >  記事  >  データベース  >  ORACLE は SPM を通じて SQL ステートメントに HINT を追加します

ORACLE は SPM を通じて SQL ステートメントに HINT を追加します

巴扎黑
巴扎黑オリジナル
2016-11-21 15:25:331226ブラウズ

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;

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。