我有一个包含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在上一次查询中的可计算列上使用此索引?
答案 0 :(得分:1)
没有。 MySQL supports partial indexing of varchar columns但MS SQL Server没有。{/ p>
您可以通过分区加速表扫描,但我不知道SQL Server在这方面有多聪明。
答案 1 :(得分:1)
我不认为SQL查询引擎会意识到LEFT20_CompanyName列如此整齐地映射到CompanyName列 - 因为计算列几乎可以使用任何公式,因此无法知道它在这种情况下,该另一列的索引实际上是有用的。
为什么不在CompanyName列上创建索引?那么,如果该领域的一些值比平均值长?如果你直接在列上创建它并完全避开计算列,我认为它会在两种情况下使用索引。
也许我错过了一些东西,但我不确定你是通过仅对前20个字符执行计算列来获得的。