Sql server 大型nvarchar列的SQL Server索引失败

Sql server 大型nvarchar列的SQL Server索引失败,sql-server,indexing,Sql Server,Indexing,我有一个2000大小的nvarchar列。有时,当我插入时,会出现以下错误: System.Data.SqlClient.SqlException:操作失败。索引项 索引“NonClusteredIndex-20161206-202443”的长度为1146字节 超过了900字节的最大长度 但我不知道该怎么办。这个表有45m条记录,所以它必须有一个索引 有什么想法吗?为这么大的字符串列编制索引通常是一个相当糟糕的迹象。我想首先问一下,你是否真的想要一个全文索引。这对于文本比普通索引更有用 如果确实

我有一个2000大小的nvarchar列。有时,当我插入时,会出现以下错误:

System.Data.SqlClient.SqlException:操作失败。索引项 索引“NonClusteredIndex-20161206-202443”的长度为1146字节 超过了900字节的最大长度

但我不知道该怎么办。这个表有45m条记录,所以它必须有一个索引


有什么想法吗?

为这么大的字符串列编制索引通常是一个相当糟糕的迹象。我想首先问一下,你是否真的想要一个全文索引。这对于文本比普通索引更有用

如果确实需要索引,则可以使用计算列提取一定数量的字符并在此基础上构建索引:

alter table t add col100 as (left(col, 100));

create index ind_t_col100 on t(col100);
确保对任何应使用索引的表达式使用
col100


如果索引的目的是保证唯一性,则可以计算校验和和以及前100个字符,并根据这些值创建唯一索引。

这是哪种类型的列的可能重复?你有什么字符串这么长,你需要索引它?你拿那个专栏干什么?您是否将其用于类似“%abc”的
搜索功能?如果您打算使用该列的字符串进行搜索,我可以建议使用全文索引吗?这是一个翻译列,我使用的是equal运算符,请从表中选择*,其中列='TEXT',然后不要这样做。这是一个非常糟糕的设计。翻译表通常包含短语ID和各种语言的翻译。为什么要使用这些翻译中的一个作为密钥?@MazenAbuTaweelih使用具有商业意义的密钥是个坏主意。用一个短语作为一个键,它可以因为一点点原因而改变(例如拼写检查),这是一个非常糟糕的主意。它是一个翻译表,如果翻译已经存在于表中,则使用索引检索翻译,因此我不会再次翻译它。@MazenabutaWellih然后您可以对整个文本执行校验和/哈希等操作,并检查该校验和/哈希是否已经存在,正如Gordon已经提到的,不需要哈希。使用短语ID/资源ID和各种语言的翻译。什么是(任意)初级阶段变化?如果它有输入错误怎么办?@PanagiotisKanavos如果他在翻译整个文本,不想再做一遍翻译怎么办?我不是试图提取单词翻译,我只是按原样翻译短语,还有另一个参数指定语言,确切的查询是这样的,从表中选择*,其中text='text'和destinationlanguage='xx'