在nvarchar(max)列上创建索引

5

我有一个包含三列的表。如果在我的select语句中选择NVARCHAR(MAX)列,我会发现性能差。是否有可能在NVARCHAR(MAX)列上创建索引?

CREATE TABLE TEST
(
     id primary key,
     product VARCHAR(50),
     Title NVARCHAR(max)
)

INSERTING MILLIONS OF RECORDS....

SELECT product, Title 
FROM TEST

这个表包含数百万条记录。我该如何为这一列创建索引?这真的会提高我的select语句的性能吗?或者还有其他方法可以改善这个问题吗?


3
你无法对 nvarchar(MAX) 列创建索引。根据文档,"大型对象(LOB)数据类型 ntext、text、varchar(max)、nvarchar(max)、varbinary(max)、xml 或 image 的列不能作为索引的关键列指定"。如果没有 WHEREJOIN 子句,索引通常不会提高查询的性能。 - Dan Guzman
5
在SQL Server中,索引条目的最大大小为900字节,并且这是可变长度列的可能大小,所以对于NVARCHAR,最大大小将是一个NVARCHAR(450)列。任何更大的内容都无法进行索引。 - marc_s
谢谢。我们应该像下面这样使用include(index)吗?这样正确和有用吗? 在test表上创建索引ix_test,包括title字段。 - Ram
2个回答

3
您可以使用"全文搜索索引"来索引一个 NVARCHAR(MAX)。
另外,您所发布的 SQL 没有包含 "WHERE" 或 "JOIN" 语句,因此我相信索引不会提高所有标题的 "SELECT" 性能。当然,它会降低插入速度,因为添加额外索引会使插入变慢。

1
当这个问题在SQL Server 2012中发布时,任何类型的索引键(包括聚集索引和非聚集索引)的限制都是900字节,但在后续版本的SQL Server中发生了变化。
SQL Server 2014及之前版本:
任何类型的索引键最多可以达到900字节。
因此,最大的nvarchar应该是类似于nvarchar(448)。
SQL Server 2016及以上版本:
聚集索引键:900字节 非聚集索引键:1700字节
因此,最大的nvarchar应该是类似于nvarchar(848)。
参考:https://learn.microsoft.com/en-us/sql/sql-server/maximum-capacity-specifications-for-sql-server?view=sql-server-2016

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接