CREATE TABLE文では、DATASETデータ型の列レベル属性をサポートしています。
列レベルのスキーマまたはインスタンス レベルのスキーマを使用して、DATASETテーブル列を定義できます。
列レベルのスキーマ
通常、テーブル列内のすべてのDATASET値は同じスキーマを継承しています。このような場合は、スキーマをテーブル列に関連付けることが適切です。CREATE storage_format SCHEMA文を使用してスキーマを指定し、CREATEまたはALTER TABLE文のWITH SCHEMA句を使用して、このスキーマにDATASET列を関連付けることができます。
列レベルのスキーマを使用すると、次のようなストレージとパフォーマンスの利点があります。
- スキーマは、データ ディクショナリ内に一度格納されます。行に各DATASET値とともに格納されません。この結果、I/Oが減少するため、パフォーマンスはわずかに低下するものの、ストレージ領域を大幅に削減できます。
- 多くの場合、スキーマは、クエリーの実行中にDATASET列に対して一度だけ解析する必要があります。スキーマの解析にはコストがかかるため、これにより大幅なパフォーマンス向上を実現できます。
次の例は、列レベルのスキーマを使用する、Avro格納形式のDATASET列を示しています。
CREATE AVRO SCHEMA avro_schema_1 as '{"type":"record", "name":"rec_0","fields":[ {"name":"ProductID","type":"int"}, {"name":"Price","type":"int"} ]}';
CREATE TABLE mytable(c1 INTEGER, c2 DATASET STORAGE FORMAT AVRO WITH SCHEMA avro_schema_1);
次の例は、列レベルのスキーマを使用する、CSV格納形式のDATASET列を示しています。
CREATE CSV SCHEMA myCSVSchema AS '{ "field_delimiter" : "\t", "record_delimiter" : ";" }';
CREATE TABLE myDatasetTable02 ( id INTEGER, csvFile DATASET(100000) INLINE LENGTH 5000 STORAGE FORMAT CSV CHARACTER SET LATIN WITH SCHEMA myCSVSchema );
インスタンス レベルのスキーマ
CREATEまたはALTER TABLE文でWITH SCHEMA句を省略すると、DATASETの値はインスタンス レベルのスキーマを使用して定義されます。この場合、スキーマとデータの両方がデータベース行内に格納されます。これにより、DATASETテーブルの列に、異なるスキーマを持つデータ値を格納できます。この柔軟性と引き換えに、ストレージ使用量の増加と、スキーマ解析によるパフォーマンスの低下が生じます。
次に、CSV格納形式のDATASET値に対するインスタンス レベルのスキーマを示します。
CreateDATASET ( '{"field_delimiter":"&", "record_delimiter":"#" }', 'Item ID&Item Name&Item Color #55&bicycle&red#88&toy boat&pink#105&soap&#', CSV, UNICODE )
DATASETの妥当性検査を無効にする
DATASETの値がDATASETテーブルの列に挿入されると、スキーマとデータ値が検証され、パフォーマンスが低下する可能性があります。DATASET列が列レベルのスキーマを使用して定義されている場合でも、挿入時にデータをスキーマと照らし合わせて検証する必要があります。この妥当性検査を無効にするには、DBSコントロール フィールドのDisableDATASETValidationをTRUEに設定します。