マテリアライズドテーブルの作成¶
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
-- 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 <expression> [, <expression>]*
INTO <table name:identifier>
FROM <FROM clause>
[ <WHERE clause> ]
[ <GROUP BY clause> ]
[ <HAVING clause> ]
<table name> ビューがすでに存在する場合、このステートメントは失敗します。
以下に例を示します。
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 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 usa_state (
SELECT 'Arizona', 'AZ', 'Phoenix'
);