数据库对象的新最大大小限制(待定)

注意

此行为变更在 2025_02 捆绑包中。

有关捆绑包的当前状态,请参阅 捆绑包历史记录

启用此行为变更捆绑包后,数据库对象的存储会发生如下更改:

变更前:

对于以下类型的列,允许的最大长度为 16 MB

  • VARCHAR

  • VARIANT

  • ARRAY

  • OBJECT

对于以下类型的列,允许的最大长度为 8 MB

  • BINARY

  • GEOGRAPHY

  • GEOMETRY

试图存储大于这些最大允许长度的值的语句失败。

变更后:

对于以下类型的列,允许的最大长度为 128 MB

  • VARCHAR

  • VARIANT

  • ARRAY

  • OBJECT

对于以下类型的列,允许的最大长度为 64 MB

  • BINARY

  • GEOGRAPHY

  • GEOMETRY

试图存储高达这些新最大允许长度的值的语句成功。试图存储大于这些最大允许长度的值的语句失败。

对于现有表和变更后创建的表,类型为 VARIANT、ARRAY 和 OBJECT 的列的默认长度为 128 MB,类型为 GEOGRAPHY 和 GEOMETRY 的列的默认长度为 64 MB。

但是,类型为 VARCHAR 和 BINARY 的列的默认长度分别为 16 MB 和 8 MB。在创建新表或更改现有表时,您可以通过显式指定长度来增加长度。如果一个表具有新的限制,并且存储的对象超过 16 MB,则使用该表的 CREATE TABLE AS SELECT (CTAS) 创建的任何下游表都将失败。要防止此失败,请调整 CTAS 语句,并将相应 VARCHAR 列的大小显式设置为 134217728(BINARY 为 67108864)。

如果启用 2025_02 捆绑包后又禁用,则表中具有较大大小限制的数据库对象仍可访问。BCR-1779 引入了读取大型对象的支持,该支持已对所有账户启用,无法禁用。

有关新大小限制的更多信息,请参阅 数据库对象的大小限制

大于 16 MB 的大小在查询结果中可见

大于 16 MB(对于 VARCHAR)和大于 8 MB(对于 BINARY)的大小在查询结果中可见。例如,在调用 SYSTEM$TYPEOF 函数的查询中或提供有关函数和程序(例如 INFORMATION_SCHEMA FUNCTIONS 视图)的信息的视图查询中,大小可见。

以下示例将大小为 16 MB 的两个列连接起来:

CREATE OR REPLACE TABLE test_larger_sizes(col1 VARCHAR, col2 VARCHAR) AS
  SELECT 'foo', 'bar';

SELECT SYSTEM$TYPEOF(CONCAT(col1, col2)) FROM test_larger_sizes;
Copy
+-----------------------------------+
| SYSTEM$TYPEOF(CONCAT(COL1, COL2)) |
|-----------------------------------|
| VARCHAR(33554432)[LOB]            |
+-----------------------------------+

对于函数和程序,新的大小在 INFORMATION_SCHEMA FUNCTIONS 视图中显示:

CREATE OR REPLACE FUNCTION test_larger_sized_func(in_arg VARCHAR)
  RETURNS VARCHAR
  LANGUAGE JAVASCRIPT
  CALLED ON NULL INPUT AS
$$
  RETURN NULL;
$$
;

SELECT data_type FROM INFORMATION_SCHEMA.FUNCTIONS
  WHERE function_name = 'TEST_LARGER_SIZED_FUNC';
Copy
+--------------------+
| DATA_TYPE          |
|--------------------|
| VARCHAR(134217728) |
+--------------------+

大于 16 MB 的大小的错误消息变更

某些查询的错误消息可能会更改。

以下是返回错误的 VARCHAR 列的插入示例:

CREATE OR REPLACE TABLE test_larger_size_error(col VARCHAR);
INSERT INTO test_larger_size_error SELECT RANDSTR(20000000, 1);
Copy

变更前返回以下错误消息:

100082 (22000): Max LOB size (16777216) exceeded, actual size of parsed column is 20000000

变更后返回以下错误消息:

100078 (22000): String
'CaFHJdoX3upWliCCdAPXXgytQuXzQpFO4laQEFdmiE1NDOywjwHoBqSNTCzTW66ynuR7EsI4ZxStCh3VMIBMYeHWgv1gUZRmHEK4kGmZcC02jGQhnnFJ0jtcIEWBIN6vKGkvSwG482IvfgVVwF3FTj7sb86t1SK9qigI6ujlSNByytIYBk0lkI1MM0zpRFeH2BNvGxtI.'
is too long and would be truncated

支持的驱动程序

您可能需要将驱动程序版本更新到支持较大数据库对象的版本。否则,可能会返回类似下面的错误:

100067 (54000): The data length in result column <column_name> is not supported by this version of the client.
Actual length <actual_size> exceeds supported length of 16777216.

有关支持的驱动程序的信息,请参阅 支持结果集中大型对象的驱动程序版本

Iceberg 支持

对于非托管 Iceberg 表,VARCHAR 和 BINARY 列的默认长度为 128 MB。此限制适用于新创建的或刷新的表。在新大小限制启用之前创建且未刷新的表仍具有旧大小限制。刷新现有表以增加大小限制。

对于托管 Iceberg 表,VARCHAR 和 BINARY 列的默认长度为 128 MB。在新大小限制启用之前创建的表仍具有旧大小限制。要将新大小应用于这些表,请重新创建表或更改列。以下示例更改列以使用新的大小限制:

ALTER ICEBERG TABLE my_iceberg_table
  ALTER COLUMN col1 SET DATA TYPE VARCHAR(134217728);
Copy

参考:1942

语言: 中文