SQL 一般:文字列およびバイナリデータ型の新しいデフォルトの列サイズ(保留中)

注意

この動作変更は2025_07バンドルにあります。

バンドルの現在のステータスについては、 バンドル履歴 をご参照ください。

この動作変更バンドルを有効にすると、 :doc:` 文字列およびバイナリデータ型 </sql-reference/data-types-text>` のデフォルトのサイズが変更されます。

変更前:

テキスト文字列データ型 のデフォルトのサイズは16 MB でした。

バイナリデータ型 のデフォルトサイズは8 MB でした。

変更後:

テキスト文字列データ型のデフォルトのサイズは128 MB です。

バイナリデータ型のデフォルトのサイズは64 MB です。

この変更の前は、 DDL ステートメントで、テキスト文字列列の場合は16 MB より大きいサイズ、バイナリ列の場合は8 MB より大きいサイズを明示的に指定できましたが、サイズが指定されていない場合のデフォルトはそれぞれ16 MB と8 MB でした。

この動作変更後、 DDL ステートメントでサイズが指定されていない場合、デフォルトのサイズはテキスト文字列列の場合は128 MB 、バイナリ列の場合は64 MB です。そのため、 INSERT ステートメントでは、明示的に大きいサイズを指定しなくても、テキスト文字列列には 16 MB より大きい値を挿入でき、バイナリ列には 8 MB より大きい値を挿入できます。

注釈

この変更は、 Apache Iceberg™ テーブルとユーザー定義関数( UDFs )の DDL ステートメントには影響しません。これらのテーブルとユーザー定義関数では、すでに大きいデフォルトサイズが使用されているためです。

この変更は、 VARCHAR データ型の列と、 STRING などの VARCHAR と同義のデータ型の列に適用されます。ただし、デフォルトサイズが1のデータ型( CHAR 、 CHARACTER 、 NCHAR など)は除きます。この変更は、 BINARY データ型の列と、 VARBINARY など、 BINARY と同義のデータ型の列にも適用されます。

たとえば、次のステートメントでは、列の最大サイズを指定せずにテーブルを作成します。

CREATE TABLE test_new_default_sizes (
  name VARCHAR,
  profile_image BINARY);
Copy

列の最大サイズを表示するには、次のクエリを実行します。

DESCRIBE TABLE test_new_default_sizes
  ->> SELECT "name", "type" FROM $1;
Copy

動作変更前は、クエリによって次の出力が返されます。

+---------------+-------------------+
| name          | type              |
|---------------+-------------------|
| NAME          | VARCHAR(16777216) |
| PROFILE_IMAGE | BINARY(8388608)   |
+---------------+-------------------+

動作変更後、クエリによって次の出力が返されます。

+---------------+--------------------+
| name          | type               |
|---------------+--------------------|
| NAME          | VARCHAR(134217728) |
| PROFILE_IMAGE | BINARY(67108864)   |
+---------------+--------------------+

ビューとマテリアライズドビューは、大きなデフォルトサイズを継承できます。

場合によっては、列定義で式を使用するビューまたはマテリアライズドビューを作成すると、ソーステーブルの列で明示的に小さいサイズが指定されていても、列は新しいデフォルトサイズを継承します。

たとえば、 VARCHAR データ型の列の最大サイズを明示的に16777216に設定するソーステーブルを作成します。

CREATE TABLE test_default_size_source_table (
  id INTEGER,
  description VARCHAR(16777216));
Copy

列定義で式を使用せずに、このテーブルに基づいてビューとマテリアライズドビューを作成します。

CREATE VIEW test_default_size_view AS
SELECT id, description FROM test_default_size_source_table;

CREATE MATERIALIZED VIEW test_default_size_mv AS
SELECT id, description FROM test_default_size_source_table;
Copy

列の最大サイズを表示するには、次のクエリを実行します。

DESCRIBE VIEW test_default_size_view
  ->> SELECT "name", "type" FROM $1;

DESCRIBE MATERIALIZED VIEW test_default_size_mv
  ->> SELECT "name", "type" FROM $1;
Copy

変更前も変更後も、これらのクエリは次の出力を返します。

+-------------+-------------------+
| name        | type              |
|-------------+-------------------|
| ID          | NUMBER(38,0)      |
| DESCRIPTION | VARCHAR(16777216) |
+-------------+-------------------+

ソーステーブルに基づいてビューとマテリアライズドビューを作成し、列定義で式を使用します。

CREATE VIEW test_default_size_view_with_exp AS
SELECT description || RANDSTR(10, 1) AS col
  FROM test_default_size_source_table;

CREATE MATERIALIZED VIEW test_default_size_mv_with_exp AS
SELECT description || RANDSTR(10, 1) AS col
  FROM test_default_size_source_table;
Copy

列の最大サイズを表示するには、次のクエリを実行します。

DESCRIBE VIEW test_default_size_view_with_exp
  ->> SELECT "name", "type" FROM $1;

DESCRIBE MATERIALIZED VIEW test_default_size_mv_with_exp
  ->> SELECT "name", "type" FROM $1;
Copy

動作変更前、これらのクエリは次の出力を返します。

+------+-------------------+
| name | type              |
|------+-------------------|
| COL  | VARCHAR(16777216) |
+------+-------------------+

動作変更後、これらのクエリは次の出力を返します。

+------+--------------------+
| name | type               |
|------+--------------------|
| COL  | VARCHAR(134217728) |
+------+--------------------+

CREATE TABLE AS SELECT を使用して作成されたテーブルは、大きなデフォルトサイズを継承できます。

場合によっては、列定義で式を使用する CREATE TABLE AS SELECT ( CTAS )ステートメントを使用してテーブルを作成すると、ソーステーブルの列で明示的に小さいサイズが指定されていても、列は新しいデフォルトサイズを継承します。

たとえば、 VARCHAR 列と BINARY 列の最大サイズを明示的に設定するソーステーブルを作成します。

CREATE TABLE test_default_size_ctas_source_table (
  small_text VARCHAR(1000),
  medium_text VARCHAR(50000),
  large_text VARCHAR(16777216),
  binary_data BINARY(1000000));
Copy

CTAS ステートメントを使用して、このソーステーブルからテーブルを作成します。

CREATE TABLE test_default_size_ctas AS
SELECT small_text,
       medium_text,
       large_text || RANDSTR(10, 1) AS processed_text,
       binary_data
  FROM test_default_size_ctas_source_table;
Copy

この例では、 processed_text 列の列定義に式を使用しています。

列の最大サイズを表示するには、次のクエリを実行します。

DESCRIBE TABLE test_default_size_ctas
  ->> SELECT "name", "type" FROM $1;
Copy

動作変更前は、クエリは次の出力を返し、 processed_text 列には小さい方のデフォルトサイズが表示されます。

+----------------+-------------------+
| name           | type              |
|----------------+-------------------|
| SMALL_TEXT     | VARCHAR(1000)     |
| MEDIUM_TEXT    | VARCHAR(50000)    |
| PROCESSED_TEXT | VARCHAR(16777216) |
| BINARY_DATA    | BINARY(1000000)   |
+----------------+-------------------+

動作変更後、クエリは次の出力を返し、 processed_text 列には大きい方のデフォルトサイズが表示されます。

+----------------+--------------------+
| name           | type               |
|----------------+--------------------|
| SMALL_TEXT     | VARCHAR(1000)      |
| MEDIUM_TEXT    | VARCHAR(50000)     |
| PROCESSED_TEXT | VARCHAR(134217728) |
| BINARY_DATA    | BINARY(1000000)    |
+----------------+--------------------+

参照:2118