- PR -

UNION ALL を含むマテリアライズド・ビューについて

1
投稿者投稿内容
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-09-05 12:00
Oracle 10.2.0.1.0 で、高速リフレッシュのマテリアライズドビューの作成でエラーになります。おそらく高速リフレッシュに関する要件を満たしていないのだと思いますが、どれを満たしていないのか、よくわかりません。

テーブルは以下のように作っています。
コード:
CREATE TABLE A

(
ID NUMBER(38),
GROUPID NUMBER(38),
VALUE1 NUMBER(38),
VALUE2 NUMBER(38),
CONSTRAINT PK_A PRIMARY KEY(ID)
);



マテリアライズド・ビュー・ログは以下のように作っています。
コード:
CREATE MATERIALIZED VIEW LOG ON A

WITH SEQUENCE,
ROWID
(
ID,
GROUPID,
VALUE1,
VALUE2
)
INCLUDING NEW VALUES;



ここで、マテリアライズド・ビューB を以下のように作成しようとします。
コード:
CREATE MATERIALIZED VIEW B

REFRESH FAST
ON COMMIT
AS
SELECT
COUNT(*),
GROUPID,
1 AS VALUETYPE,
SUM(VALUE1) AS VALUE
FROM A
GROUP BY GROUPID
UNION ALL
SELECT
COUNT(*),
GROUPID,
2 AS VALUETYPE,
SUM(VALUE2) AS VALUE
FROM A
GROUP BY GROUPID;



このSQLでは以下のエラーになります。

引用:
行8でエラーが発生しました。:
ORA-12054: マテリアライズド・ビューにON
COMMITリフレッシュ属性を設定できません。



そこで渋々 ON COMMIT を ON DEMAND に変えてみると、今度は以下のエラーになります。

引用:
行8でエラーが発生しました。:
ORA-12015:
複合問合せから高速リフレッシュ・マテリアライズド・ビューを作成できません。



ちなみに UNION ALL をはずして、最初の SELECT のみにするとあっさり成功します。OTN の「UNION ALLを含むマテリアライズド・ビューの高速リフレッシュに関する制限」にも目を通しているのですが、私には特に問題ないように見えます。

要は REFRESH FAST, ON COMMIT 指定のマテリアライズド・ビューを作りたいのですが、原因、解決策のわかる方いらっしゃいましたら、よろしくお願いします。

※9/8 元のCREATE MATERIALIZED VIEW 文が間違っていたので修正しました。
REFRESH COMPLETE ではなく REFRESH FAST です。
また、ON DEMAND ではなく ON COMMIT です。
失礼しました。


[ メッセージ編集済み 編集者: テッテ 編集日時 2008-09-08 13:10 ]
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-09-06 01:03
引用:

REFRESH FASTを指定する場合

すべてのディテール表のROWIDが、マテリアライズド・ビュー問合せ定義のSELECTリストにあること。



この要件を満たしていないようですが・・・
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-09-06 01:33
引用:

こあらさんの書き込み (2008-09-06 01:03) より:
引用:

REFRESH FASTを指定する場合

すべてのディテール表のROWIDが、マテリアライズド・ビュー問合せ定義のSELECTリストにあること。



この要件を満たしていないようですが・・・



お返事ありがとうございます。

「すべてのディテール表のROWIDが、マテリアライズド・ビュー問合せ定義のSELECTリストにあること。」は、「結合のみを含むマテリアライズド・ビュー」に REFRESH FAST 指定するための条件として挙げられていますが、このケースは結合は含んでいません。
(そもそも集計してるので ROWID の指定のしようがありませんが…)

このケースは「集計を含むマテリアライズド・ビュー」に該当すると認識しています。
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-09-06 10:57
大変失礼致しました。上から読んで来て行き過ぎてしまいました。。。
やり直してみます。

引用:
マテリアライズド・ビューに次のいずれかが含まれる場合は、従来のDMLの挿入およびダイレクト・ロードに対してのみ高速リフレッシュがサポートされます。

* MINまたはMAX集計を含むマテリアライズド・ビュー
* SUM(expr)を含むがCOUNT(expr)を含まないマテリアライズド・ビュー
* COUNT(*)を含まないマテリアライズド・ビュー

このようなマテリアライズド・ビューは、挿入専用マテリアライズド・ビューと呼ばれます。



引用:
挿入専用集計マテリアライズド・ビューの問合せ、リモート表などの機能は、 UNION ALL を含むマテリアライズド・ビューではサポートされません。



と言うことなので、現状だと挿入専用なのかもしれません。
VALUE1,VALUE2に not null制約を追加するか、
COUNT(VALUE1),COUNT(VALUE2)をUNIONのSELECT句にそれぞれ追加すると
挿入専用で無いマテリアライズド・ビューの要件を満たせそうです。

表8-2 集計を含むマテリアライズド・ビューの要件
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05763-01/basicmv.htm#g1014280

斜め読みしただけなので、また間違っていたらゴメンナサイ。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-09-08 13:12
引用:

VALUE1,VALUE2に not null制約を追加するか、
COUNT(VALUE1),COUNT(VALUE2)をUNIONのSELECT句にそれぞれ追加すると
挿入専用で無いマテリアライズド・ビューの要件を満たせそうです。



お返事ありがとうございます。

ご指摘の通りで、COUNT(VALUE1),COUNT(VALUE2) を SELECT 句に追加することで解決しました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)