USER MANUALS

マテリアライズドテーブルの作成

CREATE MATERIALIZED TABLE ステートメントの構文です。

CREATE MATERIALIZED TABLE ステートメントの構文
CREATE [ OR REPLACE ] MATERIALIZED TABLE [<database:identifier>.]<name:identifier>
  (
      <VDP type field> [, <VDP type field> ]*
    | <SQL type field> [, <SQL type field> ]*
  )
  [ FOLDER = <literal> ]
  [ <primary key> ]

CREATE [ OR REPLACE ] MATERIALIZED TABLE [<database:identifier>.]<name:identifier>
  AS <SELECT statement>

<VDP type field> ::=
  <name:identifier> : <Virtual DataPort data type>
    [ ( <property> [, <property> ]+ ) ]

<SQL type field> ::=
  <name:identifier> <SQL type> [ ( <property> [, <property> ]+ ) ]

<SQL type> ::=
    BIT ( <integer> )
  | BIT VARYING ( <integer> )
  | BLOB
  | BOOLEAN
  | CHAR ( <integer> )
  | CHARACTER ( <integer> )
  | CHARACTER VARYING ( <integer> )
  | DATE
  | DECIMAL
  | DECIMAL ( <integer>, <integer> )
  | DOUBLE
  | DOUBLE PRECISION
  | FLOAT
  | INT
  | INTEGER
  | LONG
  | NCHAR ( <integer> )
  | NUMERIC
  | NUMERIC ( <integer> , <integer> )
  | NVARCHAR ( <integer> )
  | REAL
  | SMALLINT
  | TEXT
  | TIMESTAMP
  | TIMESTAMP WITH TIME ZONE
  | VARCHAR ( <integer> )

<property> ::=
  <name:identifier> [ = <value:identifier> ]

<primary key> ::=
  [ CONSTRAINT <name:literal> ]
  PRIMARY KEY ( <field name:literal> [, <field name:literal> ]* )

<Virtual DataPort data type> ::= (「 Virtual DataPort のデータ型 」を参照)

マテリアライズドビューの作成方法は 3 つあります。

構文 1: CREATE MATERIALIZED TABLE

CREATE MATERIALIZED TABLE の例
-- Using ANSI SQL data types
CREATE OR REPLACE MATERIALIZED TABLE united_states_of_america_state (
        name VARCHAR(20)
      , abbreviation CHAR(2)
      , capital VARCHAR(100)
   )
CONSTRAINT 'primary_key_usa_state' PRIMARY KEY ('name');
;

-- Using Virtual DataPort data types
CREATE OR REPLACE MATERIALIZED TABLE united_states_of_america_state (
         name : text
       , abbreviation : text
       , capital : text
    )
CONSTRAINT 'primary_key_usa_state' PRIMARY KEY ('name');
;

これらのステートメントは、データが存在しないマテリアライズドテーブルを作成します。 以下のセクション で、テーブルにデータを挿入する方法について説明します。

どちらのステートメントも同じことを実行します。

  • 1 番目のステートメントは、データ型の名前を含む ANSI SQL 構文を使用します。

  • 2 番目のステートメントは、Virtual DataPort のデータ型を使用します。この構文では型の名前の後にコロンがありますが、1 番目の構文にはありません。

どちらが優れているということはありません。ANSI SQL データ型を使用してテーブルを作成する場合、それらのデータ型は内部で Virtual DataPort のデータ型に変換されます。

このテーブルのプライマリキーフィールドは「name」です。Virtual DataPort では、ビューのプライマリキーは強制されません。このフィールドには重複する値を挿入しないようにする必要があります。


構文 2: CREATE MATERIALIZED TABLE ... AS SELECT ...

CREATE MATERIALIZED TABLE order_current_year
AS SELECT *
FROM order
WHERE TRUNC(sale_date, 'YEAR') = TRUNC(CURRENT_DATE, 'YEAR');

このステートメントは、SELECT ステートメントのスキーマでマテリアライズドビューを作成し、クエリの結果をそのビューに挿入します。


構文 3: SELECT ... INTO ...

SELECT ... INTO ... ステートメントの構文
SELECT <expression> [, <expression>]*
  INTO <table name:identifier>
  FROM <FROM clause>
  [ <WHERE clause> ]
  [ <GROUP BY clause> ]
  [ <HAVING clause> ]

<table name> ビューがすでに存在する場合、このステートメントは失敗します。

以下に例を示します。

SELECT... INTO の例
SELECT order_date, total_amount
INTO order_current_year
FROM order
WHERE TRUNC(sale_date, 'YEAR') = TRUNC(CURRENT_DATE, 'YEAR');

このステートメントは、「order_date」フィールドおよび「total_amount」フィールドを持つマテリアライズドテーブル「order_current_year」を作成し、クエリの結果をそのテーブルに挿入します。


マテリアライズドテーブルを作成する場合、Virtual DataPort サーバーは操作が終了するまでデータベースをシングルユーザーモードに切り替えます。最初の構文 (CREATE MATERIALIZED TABLE ...) では、操作は即座に完了します。

2 番目の構文 (CREATE MATERIALIZED TABLE ... AS SELECT ...) と 3 番目の構文 (SELECT ... INTO ...) では、クエリが終了してその結果が格納されるまでデータベースはシングルユーザーモードのままになります。クエリが長い場合は、まず CREATE MATERIALIZED TABLE を実行します。これは即座に終了します。次に、 INSERT INTO <materialized table> ( <SELECT clause> ) コマンドでデータをマテリアライズドテーブルに挿入します (以下のセクション を参照)。INSERT ではデータベースがシングルユーザーモードに切り替わらないため、INSERT を使用してデータを挿入すると同時実行性が向上します。

マテリアライズドテーブルへのデータの挿入

マテリアライズドビューにデータを挿入する方法は 2 つあります。

構文 1

INSERT INTO <materialized table> ( <fields> )
VALUES (<values> ) [, ( <values> ) ]*

1 行または複数の行をマテリアライズドテーブルに挿入します。

このステートメントは、基本ビューおよび派生ビューに対して使用できるものと同じオプションをサポートしています (「 INSERT ステートメントの構文 」を参照)。さらに、同じステートメント内で複数の行を挿入できます。以下に例を示します。

単一の INSERT ステートメントを使用して複数の行をマテリアライズドテーブルに挿入する例
INSERT INTO usa_state (name, abbreviation, capital) VALUES
  ('Arizona', 'AZ', 'Phoenix')
, ('California', 'CA', 'Sacramento')
, ('New York', 'NY', 'Albany')
, ('North Dakota', 'ND', 'Bismarck');

構文 2

INSERT INTO <materialized table> ( <SELECT clause> )

SELECT 句の結果をマテリアライズドテーブルに挿入します。上記の構文よりも便利な点は、この構文では複数の行を一度に挿入できることです。

クエリの結果は、マテリアライズドテーブルと同じスキーマを持つ必要があります。結果では、フィールドの順序はターゲットテーブルと同じである必要があります。

INSERT... INTO ステートメントの例
INSERT INTO usa_state (
  SELECT 'Arizona', 'AZ', 'Phoenix'
);
Add feedback