作为来自外部源的批量数据加载的一部分,分阶段表定义为varchar(max)列.我们的想法是,每个列都能够保存它在源CSV文件中找到的任何内容,并且我们稍后将验证数据(类型,大小,精确度等).
但是我担心varchar(max)列对于少于200个字符的列有很多开销.设计这个的人确保我这是ETL的最佳实践,但我想我会在社区中验证这个断言.
mar*_*c_s 18
VARCHAR(MAX)列值将存储在表格行中,空间允许.因此,如果您有一个VARCHAR(MAX)字段并且它是200,300字节,那么它很可能与其余数据一起存储.这里没有问题或额外开销.
只有当单行的整个数据不再适合单个SQL Server页面(8K)时,SQL Server才会将VARCHAR(MAX)数据移动到溢出页面.
总而言之,我认为您可以充分利用这两个方面 - 尽可能使用内联存储,必要时可以进行溢出存储.
渣
PS:正如米奇指出的那样,可以关闭此默认行为 - 我没有看到任何令人信服的理由这样做,但....
varchar(n)和varchar(max)之间的存储开销是相同的.存储大小是输入的实际数据长度+ 2个字节
看看这些类似的SO问题:
/sf/ask/11646001/ 总是使用nvarchar(MAX)有什么缺点吗?