作为从外部数据源批量加载数据的一部分,暂存表被定义为varchar(max)类型的列。其想法是每个列都能够存储找到的源CSV文件中的任何内容,并且我们稍后会对数据进行验证(例如类型、大小、精度等)。
但我担心varchar(max)列存在过多开销,尤其是当列长度小于200个字符时。设计此方案的人保证这是ETL最佳实践,但我想与社区验证这种说法。
作为从外部数据源批量加载数据的一部分,暂存表被定义为varchar(max)类型的列。其想法是每个列都能够存储找到的源CSV文件中的任何内容,并且我们稍后会对数据进行验证(例如类型、大小、精度等)。
但我担心varchar(max)列存在过多开销,尤其是当列长度小于200个字符时。设计此方案的人保证这是ETL最佳实践,但我想与社区验证这种说法。
VARCHAR(MAX)列的值将根据可用空间保存在表行中。因此,如果您只有一个VARCHAR(MAX)字段且其大小为200或300字节,则很可能与其余数据一起内联存储,这里不会产生问题或额外开销。
只有当单个行的所有数据无法再适合于单个SQL Server页面(8K)时,SQL Server才会将VARCHAR(MAX)数据移动到溢出页面中。
总的来说,我认为您在两个世界中得到了最好的结果 - 在可能的情况下进行内联存储,在必要时进行溢出存储。
Marc
附注:正如Mitch所指出的那样,可以关闭此默认行为 - 然而,我没有看到任何强制执行此操作的充分理由....
varchar(n)和varchar(max)之间的存储开销相同
存储大小是输入数据的实际长度+ 2个字节
查看这些类似的SO问题:
https://stackoverflow.com/questions/166371/varcharmax-versus-varcharn-in-ms-sql-server 总是使用nvarchar(MAX)有什么缺点吗?
我想说的是,开销不应该太大,因为我认为 SQL 并没有自动分配 nvarchar 的数据量,而只会为插入的内容分配所需的空间,但我没有任何证据来证明或支持这个想法。