计算列索引

时间:2012-10-24 14:39:14

标签: performance sql-server-2005 calculated-columns

我有一个包含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 个答案:

答案 0 :(得分:1)

没有。 MySQL supports partial indexing of varchar columns但MS SQL Server没有。{/ p>

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

答案 1 :(得分:1)

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

为什么不在CompanyName列上创建索引?那么,如果该领域的一些值比平均值长?如果你直接在列上创建它并完全避开计算列,我认为它会在两种情况下使用索引。

也许我错过了一些东西,但我不确定你是通过仅对前20个字符执行计算列来获得的。