6

我有一个Com_Main包含 column的表CompanyName nvarchar(250)。它的平均长度为 19,最大长度 = 250。

为了提高性能,我想添加一个left20_CompanyName包含前 20 个字符的计算列CompanyName

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 在上次查询中的可计算列上使用此索引?

4

2 回答 2

1

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

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

于 2012-11-28T04:04:11.793 回答
1

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

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

也许我遗漏了一些东西,但我不确定您通过仅对前 20 个字符执行计算列来获得什么。

于 2012-11-28T04:14:26.250 回答