Sql 在红移中创建一个大的VARCHAR值是否有缺点?

Sql 在红移中创建一个大的VARCHAR值是否有缺点?,sql,ddl,amazon-redshift,Sql,Ddl,Amazon Redshift,源数据不断为字段抛出值,这些值的长度越来越大。现在我正在使用VARCHAR(200),但我可能会选择VARCHAR(400)。使用大数字有什么缺点吗?你说的“缺点”是什么意思?如果您没有将列设置得足够大,就会有一个很大的缺点——您无法使用它来存储要存储在那里的值 至于额外的开销,你不必担心。varchar()类型基本上只占用值所需的存储空间,加上长度的一小部分开销。此外,“400”也不是一个大数字,尤其是与“200”相比 因此,如果需要400字节来存储该值,请更改表以存储该值。更改值的长度可能会

源数据不断为字段抛出值,这些值的长度越来越大。现在我正在使用VARCHAR(200),但我可能会选择
VARCHAR(400)
。使用大数字有什么缺点吗?

你说的“缺点”是什么意思?如果您没有将列设置得足够大,就会有一个很大的缺点——您无法使用它来存储要存储在那里的值

至于额外的开销,你不必担心。
varchar()
类型基本上只占用值所需的存储空间,加上长度的一小部分开销。此外,“400”也不是一个大数字,尤其是与“200”相比

因此,如果需要400字节来存储该值,请更改表以存储该值。更改值的长度可能会有开销。我不确定RedShift是否会因为类型更改而觉得需要复制数据。但是,对性能的影响应该可以忽略不计

不要为了方便而使用最大列大小


相反,考虑可能存储在VARCHAR列中的最大值,并相应地对列进行大小调整。因为Amazon Redshift非常有效地压缩列数据,所以创建比需要大得多的列对数据表的大小影响最小。但是,在处理复杂查询时,中间查询结果可能需要存储在临时表中。因为临时表没有被压缩,所以不必要的大列会消耗过多的内存和临时磁盘空间,这会影响查询性能


我只是假设并认为为字段分配不同数量的空间会有额外的开销。这些文件毫无意义
VARCHAR()
仅为存储的值使用空间,外加固定的少量开销()。无论值是否未压缩,RedShift都不应该将varchar值填充为大于其实际长度。文档是由DB维护人员编写的,所以我想这是有原因的。更重要的是,我已经测试过了,它确实起到了作用。如果必须猜测的话,我怀疑在查询处理期间,当列被“重新物质化”为行时,数据库会为潜在的巨大列分配额外的RAM。Redshift压缩列数据,因此大小过大的VARCHAR列不应影响表的大小。但是,不必要的大VARCHAR列可能会影响查询性能: