Oracle 11gでHAVING
句を含むFAST REFRESH ON COMMIT
のマテリアライズドビューを作成しようとしています。HAVING節を使用したマテリアライズド・ビューの高速リフレッシュ?
General Restrictions on Fast Refresh
The defining query of the materialized view is restricted as follows:
- It cannot contain a HAVING clause with a subquery.
をしかし、私はHAVING count(*)>1
(注:サブクエリー)を追加した場合:
Database Data Warehousing Guideは言うにそうでない場合マテリアライズド・ビューを働いて、私はこのエラーを取得する:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
dbms_mview.explain_mview()
は言う:
REFRESH_FAST N
REFRESH_FAST_AFTER_INSERT N 2011 a HAVING clause is present
実際のコマンド:
SQL> create materialized view mv1 refresh fast on commit as
2 select UserId, count(*) from USERS group by UserId;
Materialized view created.
SQL> DROP MATERIALIZED VIEW mv1;
Materialized view dropped.
SQL> create materialized view mv1 refresh fast on commit as
2 select UserId, count(*) from USERS group by UserId
3 having count(*)>1; -- the only difference
having count(*)>1
*
ERROR at line 5:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
注:マテリアライズド・ビュー・ログが作成されます(そうでない場合は、最初の例も機能しません)。
なぜ機能しないのですか?誰もHAVING節を持つMVの例を知っていますか?少なくとも私はそこから始めることができました(私はグーグルではありましたが、私は見つけませんでした)。
注2:HAVING
が必要な理由は、ビューの行数を数千から数百万に減らすことです。ストレージを節約する(そしてパフォーマンスを向上させる)。
PS:Oracleデータベースのバージョンが使用される正確な:11.2.0.3.0は
@ GordonLinoff - HAVING節**でサブクエリ**を使用していない機能が文書化されています。問題は理にかなっています - OP *の主張*彼は彼のMV定義でサブクエリを持っていません。彼がしているかどうかは別の質問です。彼は実際のMV定義とは違ったものを投稿しましたが、その質問は完璧な意味を持ちます。 – mathguy
@mathguy問題の例は問題を再現し、サブクエリはありません。混乱を避けるために、問題の「他の」クエリの言及を削除します。 (誰もが単純な投稿された例はビジネスには意味がないと言っていますが...)。 –
さて、ゴードンはあなたのポストへの彼の質問/異議を撤回したので、それは議論のポイントです。私はちょうど私のコンピュータの1台にエンタープライズバージョンをインストールしました(私は自分自身のために学ぶだけの熱狂者です) - あなたの質問は、今日、あなたがそれを説明して確認することをモチベーションにしています。時にはドキュメントが間違っていることが知られていますが、そのことを覚えておいてください。 – mathguy