2016-08-05 6 views
5

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は

+0

@ GordonLinoff - HAVING節**でサブクエリ**を使用していない機能が文書化されています。問題は理にかなっています - OP *の主張*彼は彼のMV定義でサブクエリを持っていません。彼がしているかどうかは別の質問です。彼は実際のMV定義とは違ったものを投稿しましたが、その質問は完璧な意味を持ちます。 – mathguy

+0

@mathguy問題の例は問題を再現し、サブクエリはありません。混乱を避けるために、問題の「他の」クエリの言及を削除します。 (誰もが単純な投稿された例はビジネスには意味がないと言っていますが...)。 –

+0

さて、ゴードンはあなたのポストへの彼の質問/異議を撤回したので、それは議論のポイントです。私はちょうど私のコンピュータの1台にエンタープライズバージョンをインストールしました(私は自分自身のために学ぶだけの熱狂者です) - あなたの質問は、今日、あなたがそれを説明して確認することをモチベーションにしています。時にはドキュメントが間違っていることが知られていますが、そのことを覚えておいてください。 – mathguy

答えて

2

はい、ドキュメントが正確であるとは思えません。

回避策として、ネストされたマテリアライズド・ビューを実装できます。

CREATE MATERIALIZED VIEW mv1 
REFRESH FAST ON COMMIT 
AS 
SELECT col1, 
     COUNT(col1) count_col1 
FROM test_table 
GROUP BY col1 

ALTER MATERIALIZED VIEW mv1 ADD CONSTRAINT pk_mv1 PRIMARY KEY (col1) 

CREATE MATERIALIZED VIEW LOG ON mv1 WITH PRIMARY KEY; 

CREATE MATERIALIZED VIEW MV2 
REFRESH FAST ON COMMIT AS 
SELECT col1, 
     count_col1 
FROM mv1 
WHERE count_col1 > 1 
+0

はい、これは動作しますが、私の目標はディスクに格納されている行をまったく持っていないことです。それを反映するように質問を更新します。 –

関連する問題