Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我可以将聚集列存储索引放在具有NVARCHAR(MAX)字段的表上吗?_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

Sql 我可以将聚集列存储索引放在具有NVARCHAR(MAX)字段的表上吗?

Sql 我可以将聚集列存储索引放在具有NVARCHAR(MAX)字段的表上吗?,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我在SQL Server 2016中有一个包含200 GB数据的表。因此,我计划在该表中应用群集ColumnStore,以实现磁盘压缩和更好的性能 但问题是在该表下有一列的数据类型是NVARCHAR(MAX),而columnstore索引不支持该数据类型 所以我想的是将数据类型从NVARCHAR(max)更改为在同一列中至少接受81446个字符的任何其他数据类型 我尝试过SQL中可用的一些其他数据类型,比如VARCHAR(8000),但它所做的是删除8000个字符之后的其他数据 我也试过发短信。

我在SQL Server 2016中有一个包含200 GB数据的表。因此,我计划在该表中应用群集ColumnStore,以实现磁盘压缩和更好的性能

但问题是在该表下有一列的数据类型是NVARCHAR(MAX),而columnstore索引不支持该数据类型

所以我想的是将数据类型从NVARCHAR(max)更改为在同一列中至少接受81446个字符的任何其他数据类型

我尝试过SQL中可用的一些其他数据类型,比如VARCHAR(8000),但它所做的是删除8000个字符之后的其他数据

我也试过发短信。但同样在文本中,由于限制,columnstore不适用


所以你能告诉我我必须使用什么样的数据类型吗。或者有没有其他方法可以在同一个表中应用ColumnStore索引?

这里有几个不同的问题:

Q:SQL Server 2016能否在columnstore索引中使用(最大)数据类型?

编号:

当表需要时,不要使用聚集列存储索引 varchar(max)、nvarchar(max)或varbinary(max)数据类型

我通常就到此为止-如果文档告诉您不要做某事,您可能不应该这样做

Q:我可以在VARCHAR(8000)中存储超过8000个字符吗?

不。数字的意思是它所说的-它是您可以存储的最大字符数。如果您试图存储额外的数据,它将无法生存

Q:我可以构建一个没有这些(最大)字段的集群columnstore吗?

是的,通过更改数据模型和分解表。假设所涉及的表格称为FactTable:

  • 创建一个带有大文本字段的新表——我们称之为FactTable_text
  • 创建一个包含其余字段的新表——我们称之为FactTable\u数据。将聚集的columnstore索引放在上面,您将获得压缩
  • 将数据从旧FactTable迁移到这些新表中
  • 扔掉那张旧桌子
  • 创建一个名为FactTable的视图,将FactTable_数据和FactTable_文本连接在一起
  • 用户继续查询FactTable,而不知道任何更改
  • 不幸的是,您可能必须更改ETL过程,并且根据表中涉及的文本数量,您可能无法获得任何压缩。例如,假设90%的表大小都是由于文本造成的,那么您实际上没有在这里保存任何内容


    现在您开始了解为什么文档建议您这样做不是一个好主意。

    使用LOB列减小表大小的另一种解决方案是在存储和读取LOB内容时使用SQL Server的本机COMPRESS()和DECOMPRESS()函数。 这里有一个链接到

    当我发现存储在varchar(max)列中的30MB json文件根本没有被任何表压缩方法压缩时,我开始使用COMPRESS()和DECOMPRESS()。COMPRESS()使它们缩小到原来尺寸的5%以下。 压缩varchar(max)、nvarchar(max)和varbinary(max)格式效果很好

    DECOMPRESS()将返回一个二进制文件,因此如果需要,请确保将其转换或强制转换为原始格式(varchar或nvarchar)

    我不能说太多关于表现的处罚。有一些,但性能仍然是伟大的,我需要做的


    COMPRESS()使用Gzip压缩标准。支持Gzip的ETL工具可以将已经压缩的内容写入SQL Server,以便稍后使用DECOMPRESS()读取。至少C#/.NET/SSIS可以。我在stackoverflow上发现了一个错误。

    您使用的是什么DBMS?什么版本?SQL Server 2016企业版Microsoft SQL Server 2016企业版对此有何更新?我喜欢您将文本字段拆分为另一个表的想法!干杯尽管OP提到了SQL Server 2016,但我想向其他访问者指出(这是谷歌的热门作品),SQL Server 2017支持nvarchar(max)+