我在 SQL Server 2016 中有一个包含 200 GB 数据的表。所以我计划在该表中应用 Clustered ColumnStore 以进行磁盘压缩以及更好的性能。
但问题是在该表下有一个数据类型为 NVARCHAR(MAX) 的列,并且列存储索引不支持该数据类型。
所以我的想法是将数据类型从 NVARCHAR(max) 更改为任何其他至少接受同一列中 81446 个字符的数据类型。
我尝试了 SQL 中可用的其他一些数据类型,如 VARCHAR(8000) 但它所做的是删除了 8000 个字符之后的其他数据。
我也试过文字。但同样在 Text 中,由于限制,列存储不适用。
所以你能告诉我我必须使用什么数据类型吗?或者有没有其他方法可以在同一个表中应用 ColumnStore 索引?
最佳答案
您在这里有几个不同的问题:
问:SQL Server 2016 可以在列存储索引中使用 (MAX) 数据类型吗?
号The documentation states :
Don't use a clustered columnstore index when the table requires varchar(max), nvarchar(max), or varbinary(max) data types.
我通常只会停在那里 - 如果文档告诉你不要做某事,你可能不应该做。
问:我可以在 VARCHAR(8000) 中存储超过 8,000 个字符吗?
不。数字的意思是它所说的 - 它是您可以存储的最大字符数。如果您尝试存储其他数据,它将无法生存。
问:我可以在没有这些 (MAX) 字段的情况下构建聚集列存储吗?
是的,通过更改您的数据模型并分解表格。假设所涉及的表称为 FactTable:
不幸的是,您可能不得不更改 ETL 过程,并且根据表中涉及的文本数量,您可能无法获得任何压缩。例如,假设表格大小的 90% 都是由文本造成的 - 那么您实际上并没有在这里保存任何内容。
现在您开始明白为什么文档会建议您这不是一个好主意。
关于sql - 我可以在包含 NVARCHAR(MAX) 字段的表上放置聚集列存储索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50271032/