计算列索引

6
我有一张名为Com_Main的表格,其中包含一个CompanyName nvarchar(250)的列。它的平均长度为19,最大长度为250。
为了提高性能,我想要添加一个计算列left20_CompanyName,它保存了CompanyName的前20个字符:
alter table Com_main 
add left20_CompanyName as LEFT(CompanyName, 20) PERSISTED

然后我在这一列上创建索引:

create index ix_com_main_left20CompanyName 
on Com_main (LEFT20_CompanyName)

当我使用时,
select CompanyName from Com_Main
where LEFT20_CompanyName LIKE '122%'

它使用这个非聚集索引,但当查询如下:

select CompanyName from Com_Main 
where CompanyName LIKE '122%'

它使用全表扫描,不使用这个索引。

所以问题是:

是否可能让SQL Server在最后一个查询中使用这个计算列上的索引?

2个回答

1

MySQL支持对varchar列进行部分索引,但MS SQL Server不支持。

通过分区可能可以加快表扫描的速度,但我不知道SQL Server在这方面有多聪明。


1

我认为SQL查询引擎不会意识到LEFT20_CompanyName列可以与CompanyName列映射得如此完美 - 因为计算列可以使用几乎任何公式,所以它无法知道该其他列上的索引实际上在这种情况下是有用的。

为什么不直接在CompanyName列上创建索引?那么如果该字段中的一些值比平均值长,又怎样呢?如果您直接在列上创建它并避免计算列,我认为它将在两种情况下使用该索引。

也许我错过了什么,但我不确定您试图通过仅针对前20个字符进行计算列而获得什么好处。


是的,我认为你是对的,但主要目标是检查是否可以使用计算列作为索引。当然,在所有操作之后,我创建了一个CompanyName列的索引。看起来MS SQL不支持varchar列的部分索引,这就是答案。 - Mikhail Padlesny

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