【问题标题】:Performance impact of full length VARBINARY declarations in SnowflakeSnowflake 中全长 VARBINARY 声明的性能影响
【发布时间】:2021-12-26 17:45:02
【问题描述】:

我想在各种 Snowflake 表中使用 VARBINARY 列。相应的数据大小可能因不同的表而异。如果我将所有此类列都定义为全长,是否会对性能产生任何影响?

offical docs 表示全长 VARCHAR 列对性能没有影响。此外,一列仅消耗存储的实际数据量。 我假设这些陈述对于 VARBINARY 也是正确的,但在任何地方都找不到具体提到的。有人可以确认这种行为吗?

【问题讨论】:

  • 这适用于所有数据类型。 Snowflake 不会为数据类型的长度预留空间,因此不会对基于列定义的存储或性能造成影响。

标签: snowflake-cloud-data-platform


【解决方案1】:

正如迈克所说,这是真的。我还会说这是真的,因为微分区是不可变的,因此如果您有 1MB、3MB 或 9MB 的变体/varchar/varbinary。微分区的数据以Columnar形式一次性写入。因此 var* 数据的超级变量列被写入一个条带中。

可变大小的数据会扼杀经典的基于行的 DB 的性能,因为它能够在行宽未知时查找下一行,因此要么使用固定大小的列或辅助表来处理动态Blob 分配。

所以回到你的问题,如果你只是使用类型text 作为varchar 并查看表格的 DDL,它会说类似varchar(16777216),因为宽度不是一个有影响的字符。从性能的角度来看。

现在,如果您在这些列上读取/过滤,那么在您的表中存在大量 blob 会对性能产生影响,因为所有数据都必须从存储层读取。因此,如果您执行SELECT * FROM table WHERE split(massive_col,',',3) = 'eee' 这将加载大量数据以找到所需的行。

这可以通过以“原始”形式存储数据以及您计划如何分解它来改进,如果您知道的话,您可以拥有可以单独读取的较小部分(这就是变体自动发生的事情)数据)。但实际上,如果您想要对超宽数据进行高性能处理,那么通过一些范围很广的聚类键对其进行排序是最好的选择。因此,当您要求 SELECT key, suerp_massive FROM table WHERE key = 10 时,您会修剪很多没有 10 值的表,因此永远不要阅读超大容量列。

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多