1

アプリケーションでマテリアライズド ビューのチューニングを実行しようとしています。私は実行に着手しました:

 dbms_advisor.tune_mview()

プロシージャを作成し、Oracle SQL Developer の SQL_Worksheet に次のコードを記述しました。

variable mvtask varchar2(100); 
variable mvddl varchar2(4000);

execute :mvtask := 'MV_FOO_BAR';
execute select query into :mvddl from user_mviews where view_name = 'MV_FOO_BAR';

execute dbms_advisor.tune_mview(:mvtask, :mvddl);

select * from user_tune_mview;

明らかに、具体化されたビューは既に作成されています (refresh fast on commmitただし、許容できないほど遅くなります)。Advisor は次のエラーを報告します。

エラーレポート:
ORA-13600: アドバイザでエラーが発生しました
QSM-03112: CREATE MATERIALIZED VIEW文が無効です
ORA-06512: "SYS.DBMS_SYS_ERROR"、86行目
ORA-06512: "SYS.PRVT_ACCESS_ADVISOR"、行 202
ORA-06512: "SYS.PRVT_TUNE_MVIEW"、1026行目
ORA-06512: "SYS.DBMS_ADVISOR"、行 754
ORA-06512: 1行目
13600.00000 - "Advisor でエラーが発生しました\n%s"
*原因: アドバイザでエラーが発生しました。
           このメッセージの後に 2 番目のメッセージが続きます。
           エラーの性質に関する詳細。
*アクション: アドバイザのドキュメントを参照してください
           2 番目のエラー メッセージの説明については、

しかし、それ以上の報告はなく、2 番目のエラー メッセージの痕跡もありません。ここで何が問題なのか知っている人はいますか?MV が既に存在し、データベースで動作しているため、ゆっくりではありますが、さらに驚いています。

関連するメモとして、SQL Developer で複数行の文字列を入力する方法を知っている人はいますか。次のようなものを試すと:

execute :mvddl :='create materialized view MV_FOO_BAR
build immediate
refresh fast on commit
...
';

SQL Developer は最初の行でチョークします。文字列の連結が頭をよぎりましたが、100 ~ 150 行の MV がいくつかあり、それらのそれぞれに対して手動で行うのは嫌です。

4

1 に答える 1

6

(1)エラー13600のテキストが「2番目のエラーメッセージ」を参照している場合、それはスタック内の次のエラー(この場合はQSM-03112)を意味します。

(2)エラーの理由は、TUNE_MVIEWの呼び出しの2番目のパラメーターが、CREATE MATERIALIZED VIEWステートメントの全文であることが意図されているが、照会テキストのみを渡しているためだと思います。

(3)複数行の問題については、「実行」の代わりに明示的なPL /SQL匿名ブロックを使用すると機能すると思います。例:

BEGIN
  :mvddl := 'create materialized view MV_FOO_BAR
             build immediate
             refresh fast on commit
             ...
            ';
END;
/
于 2009-03-20T15:32:39.457 に答える