【发布时间】:2009-05-13 14:21:48
【问题描述】:
作为来自外部源的大量数据加载的一部分,暂存表是使用 varchar(max) 列定义的。其想法是,每列都将能够保存它在源 CSV 文件中找到的任何内容,并且我们稍后将验证数据(针对类型、大小、精度等)。
但我担心 varchar(max) 列对于少于 200 个字符的列有很多开销。设计这个的人向我保证这是 ETL 的最佳实践,但我想我会在社区中验证这个断言。
【问题讨论】:
标签: sql-server ssis
作为来自外部源的大量数据加载的一部分,暂存表是使用 varchar(max) 列定义的。其想法是,每列都将能够保存它在源 CSV 文件中找到的任何内容,并且我们稍后将验证数据(针对类型、大小、精度等)。
但我担心 varchar(max) 列对于少于 200 个字符的列有很多开销。设计这个的人向我保证这是 ETL 的最佳实践,但我想我会在社区中验证这个断言。
【问题讨论】:
标签: sql-server ssis
如果空间允许,VARCHAR(MAX) 列值将存储在表行中。因此,如果您有一个 VARCHAR(MAX) 字段并且它是 200、300 字节,那么它很可能会与您的其余数据内联存储。这里没有问题或额外的开销。
只有当单个 SQL Server 页面 (8K) 无法容纳单行的全部数据时,SQL Server 才会将 VARCHAR(MAX) 数据移动到溢出页面中。
总而言之,我认为您可以两全其美 - 尽可能内联存储,必要时溢出存储。
马克
PS:正如 Mitch 指出的那样,可以关闭此默认行为 - 但是我没有看到任何令人信服的理由这样做......
【讨论】:
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)?
【讨论】:
据我所知,您可能正在考虑的开销(以与在 sql server 中存储 TEXT 或 BINARY 值相同的方式将数据存储在行外)仅适用于数据大小超过 8000 字节的情况.因此,在 ETL 过程中使用较小的列应该没有问题。
【讨论】:
如果您在 MSSQL2005 中使用 varchar(max) 或 varbinary(max),SSIS 会为记录中的每一列创建一个临时文件,这会降低您的性能并成为一个大问题。 MS声称他们在MSSQL2008中解决了这个问题。
【讨论】:
好吧,我想说不应该有那么大的开销,因为我认为 sql 不会自动为 nvarchar 分配分配的数据量,而是只分配插入所需的数据,但我没有任何东西可以证明或支持这个想法。
【讨论】: