6

Com_Maincolumn を含むテーブルがあります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列の部分インデックスをサポートしていますが、MSSQLServerはサポートしていません。

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

于 2012-11-28T04:04:11.793 に答える
1

SQL クエリ エンジンは、LEFT20_CompanyName 列が CompanyName 列にきれいにマップされていることを認識するとは思いません。計算列は実質的に任意の式を使用できるため、他の列のインデックスが実際にこの場合に役立ちます。

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

何かが足りないのかもしれませんが、最初の 20 文字だけで計算列を実行することで何を得ようとしているのかわかりません。

于 2012-11-28T04:14:26.250 に答える