如何在sql中为字符串列创建索引?

问题描述:

我有一个3列的表:列表ID,名称和数值。 目标是使用表来检索和更新各种列表中名称的数字值。如何在sql中为字符串列创建索引?

问题是,sql拒绝创建名称列索引,因为它是一个可变长度的字符串列。

如果没有使用名称进行索引选择将会效率低下,并且使用静态长度文本列的选项会浪费大量存储空间,因为名称可能相当长。

什么是建立这个表的最好方法,它的索引?

(运行SQL Server 2008)

+0

字符串列有多长?什么是实际的错误?该指数的目的是为了满足寻求更好的目的? – 2012-02-26 18:00:09

+1

SQL Server中的任何索引可以是每个索引条目最多900个字节的** **如果您的字符串列比这个长,那么您**不能**索引它。 **向我们展示**您的确切,完整的餐桌结构! – 2012-02-26 18:00:54

无法在ntexttext列(我猜你的名字列是那种类型,或者(n)varchar长于900字节)上创建常规索引。您可以在该列类型上创建全文索引。

+1

我不知道为什么你认为“名称”必须使用不推荐使用的数据类型。你有没有尝试在'varchar(max)'列创建索引?提示:这不是一个有效的索引。你可以添加'varchar(max)'列作为'INCLUDE'列,但这很少明智,无论如何也无助于搜索。 – 2012-02-26 18:08:48

+0

我错了关于varchar(max)的索引,你是对的。 – Tomek 2012-02-26 18:15:48

如果字符串长于900个字节,则它不能是索引键,而不管其是否是可变或固定长度。

一个想法是至少通过添加一个计算列使查找更具选择性。例如

CREATE TABLE dbo.Strings 
(
    -- other columns, 
    WholeString VARCHAR(4000), 
    Substring AS (CONVERT(VARCHAR(10), WholeString) PERSISTED 
); 
CREATE INDEX ss ON dbo.Strings(Substring); 

现在将行更新搜索时,你可以说:

WHERE s.Substring = LEFT(@string, 10) 
AND s.WholeString = @string; 

这将至少有助于优化缩小其搜索到的索引页,其确切的匹配是最有可能生活。你可能想要试验一下这个长度,因为它取决于你有多少类似的字符串,以及哪些最能帮助优化器清除一个页面。您可能还想尝试在ss索引中包含部分或全部其他列,但不论使用或不使用INCLUDE子句(对于各种因素,这种用法会有很大差异,例如您的更新查询还有什么,读/写比率等)。