我有一个包含3列的表:列表ID,名称和数值。 目标是使用该表来检索和更新各种列表中名称的数值。
问题是sql拒绝使用name列创建索引,因为它是一个长度可变的字符串列。
如果没有使用名称选择索引将是低效的,并且使用静态长度文本列的选项将浪费大量存储空间,因为名称可能相当长。
构建此表及其索引的最佳方法是什么?
(运行sql server 2008)
答案 0 :(得分:5)
如果你的字符串超过900字节,那么它不能是索引键,无论它是可变长度还是固定长度。
一个想法是通过添加计算列来至少使搜索更具选择性。 e.g。
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
子句(这是否有用会因各种因素而有很大差异,例如其他因素你的更新查询,读/写比率等。)
答案 1 :(得分:4)
无法在ntext
或text
列上创建常规索引(我猜您的名称列属于该类型,或者(n)varchar长于900字节)。您可以在该列类型上创建全文索引。