作为来自外部源的批量加载数据的一部分,使用varchar(max)列定义分阶段表。我们的想法是,每个列都能够容纳它在源CSV文件中找到的任何内容,并且我们稍后将验证数据(类型,大小,精确度等)。
但是我担心varchar(max)列对于少于200个字符的列有很多开销。设计这个的人向我保证这是ETL的最佳实践,但我想我会与社区一起验证这个断言。
答案 0 :(得分:18)
VARCHAR(MAX)列值将存储在表格行中,空间允许。因此,如果您有一个VARCHAR(MAX)字段并且它是200,300字节,那么它很可能与其余数据一起存储。这里没有问题或额外开销。
只有当单行的整个数据不再适合单个SQL Server页面(8K)时,SQL Server才会将VARCHAR(MAX)数据移动到溢出页面。
总而言之,我认为您可以充分利用这两个方面 - 尽可能使用内联存储,必要时可以溢出存储。
马克
PS:正如Mitch指出的那样,可以关闭此默认行为 - 但是我没有看到任何令人信服的理由,但是....答案 1 :(得分:6)
varchar(n)和varchar(max)之间的存储开销是相同的 存储大小是输入的实际数据长度+ 2个字节
查看这些类似的SO问题:
https://stackoverflow.com/questions/166371/varcharmax-versus-varcharn-in-ms-sql-server Are there any disadvantages to always using nvarchar(MAX)?
答案 2 :(得分:3)
据我所知,您可能正在考虑的开销(以与TEXT或BINARY值存储在sql server中相同的方式存储行外数据)仅适用于数据大小超过8000字节的情况。因此,对于ETL过程,使用较小的列应该没有问题。
答案 3 :(得分:0)
如果在MSSQL2005中使用varchar(max)或varbinary(max),SSIS正在为记录中的每一列创建一个临时文件,这可能会降低性能并成为一个大问题。 MS声称他们在MSSQL2008中解决了这个问题。
答案 4 :(得分:-1)
嗯,我想说不应该有那么大的开销,因为我不认为sql会自动为nvarchar分配一定数量的数据,而只是分配插入所需的内容,但是我没有什么可以证明或支持这个想法。