1

(Oracleの)すべてのマテリアライズド・ビューをコミットすると、更新が速くなり、基礎となるすべてのデータがコピーされますか、それとも単にそれへの参照がありますか?

このマテリアライズドビューがすべてのデータをコピーする場合は、とにかく次のことを実行できます。

create table3 as ( table1 union all table2 );

これにより、テーブル3にインデックスとマテリアライズドビューログを作成できます。テーブル3は、テーブル1とテーブル2への単なる参照です。

この理由は、マテリアライズドビューに次のことを入れたいからです。

create materialized view mat1
refresh fast on commit
(
  select data, count(*)
  from (table1 union all table2)
  group by data
);

ただし、上記は高速で更新できません。

しかし、次のようなことが機能します。

create materialized view mat1
refresh fast on commit
(
  select data from table1
  union all
  select data from table2
);

create materialized view mat2
refresh fast on commit
(
  select data, count(*) 
  from mat2
  group by data
);

しかし、最初のマテリアライズドビューがすべてのデータを不必要に複製しているのではないかと心配しています。

4

2 に答える 2

3

マテリアライズドビューはまさにそれを実行します。クエリで定義されたデータを含むテーブルを作成することにより、データを「マテリアライズ」します。マテリアライズドビューを削除し、内容をテーブルとして保持することで、これを示すことができます。

DROP MATERIALIZED VIEW xxx PRESERVE TABLE;

これにより、更新されなくなったxxxという名前のテーブルが保持されます。したがって、mat1ビューは実際に両方のテーブルのすべてのデータを複製します。

考えてみてください。もしそれが組合を「参照」しているだけなら、それは通常の見方でしょうね。この場合、ケーキを持って食べることはできません。

編集:

複雑なマテリアライズド・ビューを高速リフレッシュすることはできません。COUNTなどの集計関数は、ビューを複雑にする原因の1つです。ドキュメントによると、UNION ALLもそうなので、mat1ビューが高速で更新可能であることに驚いています。

于 2011-10-13T02:34:36.017 に答える
0

はい-すべてのデータを複製します。そうでない場合は、更新する必要のないビューになります...

わかりませんが、試すことができます:

create materialized view mat1
refresh fast on commit
(
  select data, sum (c) from
  (
  select 1 x, data, count(*) c from table1 group by 1, data
  union
  select 2, data, count(*) from table1 group by 2, data
  ) group by data
);
于 2011-10-13T02:49:15.260 に答える