2012-10-24 41 views
5

テーブルCom_Mainには、列CompanyName nvarchar(250)が含まれています。そして、私はこの列に索引を作成計算された列インデックス

alter table Com_main 
add left20_CompanyName as LEFT(CompanyName, 20) PERSISTED 

:それは250

は、私は計算列CompanyNameの最初の20個の文字を保持しているleft20_CompanyNameを追加するパフォーマンスを向上させるために= 19の平均長さは、最大長さを持っています:私が使用しそう

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

いいえ、MS supports partial indexing of varchar columns MS SQL Serverではありません。

パーティショニングを使用してテーブルスキャンを高速化できるかもしれませんが、この点でSQL Serverがどのように優れているかわかりません。

1

LEFT20_CompanyName列がCompanyName列にきちんとマップされていることをSQLクエリエンジンが認識しているとは思わない - 計算列は事実上あらゆる式を使用できるため、そのインデックスを知る方法はないこの場合、実際には他の列が便利です。

なぜ単にCompanyName列にインデックスを作成しないのですか?そのフィールドのいくつかの値が平均よりも長い場合はどうなりますか?それを列に直接作成し、計算された列を完全に避けると、どちらの場合でもインデックスを使用すると思います。

多分私は何かが不足しているかもしれませんが、最初の20文字だけで計算カラムを行うことで何を得ようとしているのか分かりません。

+0

はい、私はあなたが正しいと思いますが、主な目標は、計算カラムをインデックスとして使用できるかどうかをチェックすることでした。もちろん、私はCompanyName列のインデックスを作成しました。私は、MS SQLは、varcharカラムの部分的なインデックス作成をサポートしていないと思われるので、それが答えです。 –

関連する問題