マテリアライズド ビュー リフレッシュ。 「もうMATERIALIZED VIEWの挙動でやきもきしない」 9.4での設定・運用の改善 (3/4):PostgreSQLガイダンス(2)

自動リフレッシュ

マテリアライズド ビュー リフレッシュ

投稿日時: 2008-09-05 12:00 Oracle 10. 0 で、高速リフレッシュのマテリアライズドビューの作成でエラーになります。 おそらく高速リフレッシュに関する要件を満たしていないのだと思いますが、どれを満たしていないのか、よくわかりません。 テーブルは以下のように作っています。 コード: CREATE MATERIALIZED VIEW LOG ON A WITH SEQUENCE, ROWID ID, GROUPID, VALUE1, VALUE2 INCLUDING NEW VALUES; ここで、マテリアライズド・ビューB を以下のように作成しようとします。 引用: 行8でエラーが発生しました。 : ORA-12054: マテリアライズド・ビューにON COMMITリフレッシュ属性を設定できません。 そこで渋々 ON COMMIT を ON DEMAND に変えてみると、今度は以下のエラーになります。 引用: 行8でエラーが発生しました。 : ORA-12015: 複合問合せから高速リフレッシュ・マテリアライズド・ビューを作成できません。 ちなみに UNION ALL をはずして、最初の SELECT のみにするとあっさり成功します。 OTN の「UNION ALLを含むマテリアライズド・ビューの高速リフレッシュに関する制限」にも目を通しているのですが、私には特に問題ないように見えます。 要は REFRESH FAST, ON COMMIT 指定のマテリアライズド・ビューを作りたいのですが、原因、解決策のわかる方いらっしゃいましたら、よろしくお願いします。 REFRESH COMPLETE ではなく REFRESH FAST です。 また、ON DEMAND ではなく ON COMMIT です。 失礼しました。 この要件を満たしていないようですが・・・ お返事ありがとうございます。 「すべてのディテール表のROWIDが、マテリアライズド・ビュー問合せ定義のSELECTリストにあること。 」は、「結合のみを含むマテリアライズド・ビュー」に REFRESH FAST 指定するための条件として挙げられていますが、このケースは結合は含んでいません。 (そもそも集計してるので ROWID の指定のしようがありませんが…) このケースは「集計を含むマテリアライズド・ビュー」に該当すると認識しています。 上から読んで来て行き過ぎてしまいました。。。 やり直してみます。 引用: マテリアライズド・ビューに次のいずれかが含まれる場合は、従来のDMLの挿入およびダイレクト・ロードに対してのみ高速リフレッシュがサポートされます。 引用: 挿入専用集計マテリアライズド・ビューの問合せ、リモート表などの機能は、 UNION ALL を含むマテリアライズド・ビューではサポートされません。 と言うことなので、現状だと挿入専用なのかもしれません。 VALUE1,VALUE2に not null制約を追加するか、 COUNT VALUE1 ,COUNT VALUE2 をUNIONのSELECT句にそれぞれ追加すると 挿入専用で無いマテリアライズド・ビューの要件を満たせそうです。 表8-2 集計を含むマテリアライズド・ビューの要件 斜め読みしただけなので、また間違っていたらゴメンナサイ。

次の

マテリアライズドビューの高速リフレッシュが遅くなる現象についてのメモ (::namaniku::)

マテリアライズド ビュー リフレッシュ

3 マテリアライズドビューのロック待ち軽減 一つ前のメジャーリリースであるPostgreSQL 9. 3から、マテリアライズドビュー機能が導入されました。 マテリアライズドビューとは、検索結果を記憶しておく機能を持ったビューです。 時間が掛かる集計処理などに、通常のビューの代わりに適用して、検索処理の負荷を節約するといった使い方がされます。 このとき、記憶されている検索結果を更新するには、明示的にREFRESH MATERIALIZED VIEWコマンドを実行する必要がありました。 3のマテリアライズドビューの大きな問題 PostgreSQL 9. 3のマテリアライズドビュー実装では、ここに一つ問題がありました。 REFRESH MATERIALIZED VIEWコマンドは、対象のマテリアライズドビューに対して、AccessExclusiveという、最も強いモードのテーブルロックを取得してしまうのです。 その結果、リフレッシュ処理途中のマテリアライズドビューに対するSELECTコマンドは、リフレッシュが終わるまで待たされてしまいます。 リフレッシュが短時間で終わるならばよいですが、長時間を要するケースでは、マテリアライズドビューを参照する処理が長く待たされてしまい、問題になります。 そもそも実行に時間が掛かるSELECTコマンドであったからこそ、マテリアライズドビューにしたかったはずなので、これでは本末転倒になってしまうわけです。 ゆるやかロックを許容するCONCURRENTLYオプション そこで、PostgreSQL 9. 4ではREFRESH MATERIALIZED VIEWコマンドに CONCURRENTLYという、リフレッシュ中にもアクセス可能にするオプションが追加されました。 このコマンドオプションはExclusiveという、一段階弱いモードのロックしか取得しません。 このため、対象マテリアライズドビューに平行してSELECTコマンドを実行できます。 リフレッシュ中に実行されたSELECT命令には、以前のデータが返ります。 CONCURRENTLYオプションを使うには、マテリアライズドビューに対する主キーやユニークインデックスが少なくとも一つ定義されている必要があります。 以下に使用例を示します。 4では、ALTER TABLEコマンドに対してもロック待ちを軽減する改修が行われています。 テーブル定義を変更するALTER TABLEコマンドは、並行するSELECTコマンド実行をブロックするAccessExclusiveモードのロックを必要とします。 テーブルにカラムを追加したり、データ型を変更するとなれば仕方のないところです。 しかし、ALTER TABLEコマンドのオプション指定の中には明らかにテーブル内のデータへのアクセスを制限する必要性に乏しいものがありました。 このため、PostgreSQL 9. 4からは、以下表のALTER TABLEオプションについて、データ読み書きと競合しない弱いロックモードに変更されました。 ALTER TABLE のオプション 意味 VALIDATE CONSTRAINT 制約を検証する CLUSTER ON クラスタ化で使うインデックスを指定 SET WITHOUT CLUSTER クラスタ化で使うインデックス指定を解除 ALTER COLUMN SET STATISTICS 統計情報収集について調整 ALTER COLUMN SET... カラム単位オプションを指定 ALTER COLUMN RESET... カラム単位オプション指定を解除 表2 ロックモードが変更されるALTER TABLEコマンドのオプション.

次の

Oracle 11gR2 ORA

マテリアライズド ビュー リフレッシュ

REFRESH MATERIALIZED VIEW REFRESH MATERIALIZED VIEW文は、非同期マテリアライズド・ビューを手動でリフレッシュします。 必要な権限 マテリアライズド・ビュー・ログ表に対して必要な権限は、次のとおりです。 マテリアライズド・ビュー・ログ表の所有者に必要な権限はありません。 マテリアライズド・ビュー・ログ表の所有者でない場合、SELECT ANY TABLEが必要です。 マテリアライズド・ビューに対して必要な権限は、次のとおりです。 マテリアライズド・ビューの所有者に必要な権限はありません。 マテリアライズド・ビューの所有者でない場合、SELECT ANY TABLEが必要です。 SQL構文 REFRESH MATERIALIZED VIEW ViewName パラメータ パラメータ 説明 ViewName 非同期マテリアライズド・ビューの名前。 説明 この文は、指定された非同期マテリアライズド・ビューをリフレッシュします。 この文は、独立したスレッドで、独立したトランザクションとして実行およびコミットされます。 ユーザー・トランザクションに影響はありませんが、ユーザー・スレッドはリフレッシュ処理が完了するまで待機してからユーザーに戻されます。 非同期マテリアライズド・ビューにリフレッシュ間隔を指定していない場合は、この文がビューをリフレッシュする唯一の方法です。 リフレッシュ間隔を指定している場合でも、この文を使用してビューを手動でリフレッシュできます。 リフレッシュ処理は常に独立したトランザクションで実行されるため、リフレッシュ処理は、コミットされていないユーザー・トランザクションのコミットを待機しません。 コミット済の行のみがリフレッシュ処理の対象となります。 このことは、手動のリフレッシュ文および定期的に実行される自動リフレッシュに当てはまります。 ビューに対する文で高速リフレッシュが指定されていた場合、REFRESH MATERIALIZED VIEW文では増分リフレッシュ方法が使用されます。 これ以外の場合は、完全リフレッシュ方法が使用されます。 例 REFRESH MATERALIZED VIEW bookorders; 関連項目.

次の