web-dev-qa-db-ja.com

同じ名前のマテリアライズドビューとテーブル

私はマテリアライズドビューを理解していて、以前にそれらと協力したことがあります。最近、特定のレポートに最新のデータが表示されない理由について質問がありました。私はその問題を調査しました。どうやら、彼らは以前にcrontabでロードされた一時テーブルを持っていて、後でマテリアライズドビューに切り替えました。

以下のクエリでデータベースを調べたとき(テーブルの名前が変更されました):

SELECT * FROM all_objects WHERE object_name = 'TEMP_DATA';

これは実際には同じスキーマ内の2つのオブジェクトを示しています:1つのテーブルと別のマテリアライズドビュー

OWNER   OBJECT_NAME  OBJECT_TYPE        DATA_OBJECT_ID  LAST_DDL_TIME     TIMESTAMP
SCHEMA  TEMP_DATA    TABLE                      110623  08/06/2013 15:38  2013-08-06:14:53:01
SCHEMA  TEMP_DATA    MATERIALIZED VIEW                  10/30/2015 00:00  2013-08-06:14:56:33

また、テーブルを変更して名前を変更しようとすると、マテリアライズドビューの名前を変更できないと表示されました。

私の質問は、マテリアライズドビューが実際に同じ名前のテーブルを作成するかどうかです。作成する場合、SELECTを実行すると、データはどこから取得されますか(テーブルまたはMView)?

それとも、それは以前の残りのテーブルだけですか?もしそうなら、Oracleは同じ名前の異なるタイプのオブジェクトを許可しますか? (すべてのオブジェクトに一意の名前を付ける必要があると思ったので、これには本当に困惑しました!)。

そして、それらが2つのオブジェクトである場合、次のSQLでどちらが使用されているかがわかります。

SELECT * FROM TEMP_DATA;

それへの洞察、大いに感謝します。

[〜#〜] update [〜#〜] @Alexと@Husqvikの応答に基づく:Mview定義では、以下を参照してください。

BUILD IMMEDIATE  
REFRESH COMPLETE  
START WITH TO_DATE('06-Nov-2015','dd-mon-yyyy')  
NEXT trunc(sysdate) + 1  
WITH PRIMARY KEY  

それは毎日(ここでは明日)更新する必要があるという意味ですか? START WITH明日の更新後、07-Novに変更されますか?

また、自動的に更新されますか?更新される場合は、いつ更新されますか?

このMViewを使用したレポートに最新のデータが表示されないというユーザーからの苦情があったため、更新を妨げるものはありますか。そのため、最初にこれを確認しました。

MViewの完全なDDLは次のとおりです。

DROP MATERIALIZED VIEW SCHEMA.TEMP_DATA;
CREATE MATERIALIZED VIEW SCHEMA.TEMP_DATA 
TABLESPACE ITS_DATASPACE
PCTUSED    0
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOCACHE
LOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH COMPLETE
START WITH TO_DATE('06-Nov-2015','dd-mon-yyyy')
NEXT trunc(sysdate) + 1
WITH PRIMARY KEY
AS 
/* Formatted on 2015/11/05 09:35 (Formatter Plus v4.8.8) */
SELECT *
  FROM SCHEMA.h_case_data
 WHERE status LIKE 'M%';

COMMENT ON MATERIALIZED VIEW SCHEMA.TEMP_DATA IS 'snapshot table for snapshot SCHEMA.TEMP_DATA';

CREATE INDEX SCHEMA.CASE_ID_IDX ON SCHEMA.TEMP_DATA
(CASE_ID)
LOGGING
TABLESPACE ITS_DATASPACE
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

CREATE INDEX SCHEMA.STATUS_IDX ON SCHEMA.TEMP_DATA
(STATUS)
LOGGING
TABLESPACE ITS_DATASPACE
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;
9
SamV

ドキュメントから

マテリアライズド・ビューを作成すると、Oracle Databaseは1つの内部表と少なくとも1つの索引を作成し、すべてマテリアライズド・ビューのスキーマに1つのビューを作成する場合があります。 Oracle Databaseは、これらのオブジェクトを使用して、マテリアライズド・ビューのデータを維持します。

したがって、同じ名前のテーブルとマテリアライズドビューを持つのは正常です。 MVはデータをどこかに保存する必要があるため、テーブルを持つことは理にかなっています。次に、MV自体がテーブルデータの維持方法を定義します。

ON PREBUILT TABLE を使用して、既存のテーブルのビューを作成できます。これは、「以前に一時テーブルがあり、後でマテリアライズドビューに切り替えられた」という意味だと思います。 。

DROP MATERIALIZED VIEW ... PRESERVE TABLEオプション を使用して逆方向に進むこともできます。これにより、基になるテーブルが残ります。

SELECT * FROM TEMP_DATA;の場合、基になるテーブルにクエリを実行しますが、同じ結合オブジェクトを参照しているため、区別はそれほど重要ではありません。

後で質問に追加する定義に基づいて、毎日深夜に更新されます。

10
Alex Poole

2つのスキーマオブジェクトがあります。物理的にマテリアライズドビューはテーブルです。マテリアライズド・ビュー・オブジェクトには、リフレッシュ・モード、タイプ、メソッド、およびその他のプロパティーに関するメタデータが含まれています。 ALL_OBJECTSをチェックすると、MATERIALIZEDVIEWオブジェクトにそのセグメントがないことがわかります。データディクショナリは、基になるテーブルを通常のテーブルとして扱うことができないことを保証します。そうしないと、これらの結合されたオブジェクト間の整合性が損なわれる可能性があります。

事前作成されたテーブルの上にマテリアライズド・ビューを作成することもできます。

更新:

START WITHは、更新するたびに更新されます。 NEXT STARTは、ビューが作成または更新されたときに評価されます。

データベースで通常発生する可能性のあるエラーが発生すると、更新が失敗する可能性があります。 g、十分なスペースがない、ロックタイムアウト、オブジェクトの基になるクエリの変更。

3
Husqvik