2012-10-24 97 views
5

我有一個表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使用上可計算列該指數上次查詢?

回答

1

我不認爲SQL查詢引擎會意識到LEFT20_CompanyName列映射到CompanyName列 - 因爲計算列幾乎可以使用任何公式,因此無法知道該索引其他列在這種情況下實際上是有用的。

爲什麼不在公司名稱列上創建索引?那麼,如果這個領域的一些價值超過平均水平呢?如果你直接在列上創建它,並完全避免計算列,我認爲它會在兩種情況下使用索引。

也許我失去了一些東西,但我不確定你想通過只計算前20個字符的計算列來獲得什麼。

+0

是的,我認爲你是對的,但主要目標是檢查是否可以使用計算列作爲索引。畢竟,我當然在CompanyName列上創建了一個索引。我似乎MS SQL不支持varchar列的部分索引,所以這就是答案。 –