SQL general: New default column sizes for string and binary data types (Pending)¶
启用此行为变更捆绑包后,: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 的值,而无需显式指定更大大小。
备注
此变更不影响 DDL 语句中针对 Apache Iceberg™ 表和用户定义函数 (UDFs) 的操作,因为它们已经使用了较大的默认大小。
该必能适用于 VARCHAR 数据类型的列,以及与 VARCHAR 同义的数据类型列,例如 STRING,但不包括默认大小为 1 的数据类型(包括 CHAR、CHARACTER 和 NCHAR)。该更改还适用于 BINARY 数据类型的列,以及与 BINARY 同义的数据类型列,例如 VARBINARY。
例如,以下语句创建一个未指定列最大大小的表:
CREATE TABLE test_new_default_sizes (
name VARCHAR,
profile_image BINARY);
运行以下查询以显示列的最大大小:
DESCRIBE TABLE test_new_default_sizes
->> SELECT "name", "type" FROM $1;
行为变更之前,查询返回以下输出:
+---------------+-------------------+
| 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));
基于此表创建视图和物化视图,不在列定义中使用表达式:
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;
运行以下查询以显示列的最大大小:
DESCRIBE VIEW test_default_size_view
->> SELECT "name", "type" FROM $1;
DESCRIBE MATERIALIZED VIEW test_default_size_mv
->> SELECT "name", "type" FROM $1;
更改前后,查询均返回如下输出:
+-------------+-------------------+
| 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;
运行以下查询以显示列的最大大小:
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;
行为变更前,这些查询返回以下输出:
+------+-------------------+
| 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));
使用 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;
在此示例中,processed_text 列的列定义使用了表达式。
运行以下查询以显示列的最大大小:
DESCRIBE TABLE test_default_size_ctas
->> SELECT "name", "type" FROM $1;
行为变更前,查询返回以下输出,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