2016-04-13 5 views
1

と列の値で始まる場合:12345678チェック文字列は、私は現在、私のデータベースにこのテーブル(MYTABLE)を持っている最高のパフォーマンス

:私のプログラムで

user    start 
---------------------------- 
Adam    12345 
Alex    123 
Benny   2345 

は、私は、ユーザーからの文字列、例えばを受け入れます私の目標は、私が

を使用している今のように、ユーザ入力がmyTable.Start

-- For example, it would be great to have something like: 

select * from myTable where "12345678".startsWith(start) 

-- and returns me Adam, 12345 & Alex, 123 

で始まる行を選択することです210

select user, start 
from myTable where charindex(start, "12345678") = 1 
order by start desc 

私はこの場合直接比較を行っていないのでインデックス作成の開始が役立つかどうかはわかりませんが、絶対的なひどいパフォーマンスでは、MyTableの行数は約です。

誰でもこれを達成するためのより良い方法を知っていますか?

答えて

-1

あなたは、パターン・マッチング演算子を使用しLIKEオペレータと列にインデックスを追加し、例えば必要があります。

select user, start 
from myTable where start LIKE "12345678%" 
order by start desc 

インデックスのパフォーマンスがなければ前ほど悪くなります - サーバがすべての行をチェックする必要がありますマッチのために。

インデックスを使用すると、操作は範囲検索になります。開始位置が12345678以上で、次の上位文字列よりも語彙的に小さい行(12345679)。文字列の接頭辞として機能することができ、行を見つける - 範囲検索がインデックスとロード処理のみマッチングライン

EDIT

おっとを使用することができ、クエリは反対のことを行おうとすることを逃しました。それは

"someconstantvalue" LIKE start +'%' 

と同等ですので、これは、インデックスを加速することはできません。このは、一致する前の行ごとに新しい値を生成するを持っているので、

+1

私の '開始'は常にユーザーの入力よりも短く、 '12345678%'は絶対に '12345'を返していません –

+0

あなたが求めるのは、各行に新しいパターンを作成して文字列に一致させることです。これはインデックスを利用できません。 –

0

はこれを試してみてください任意のインデックスを使用することはできません

select user, start 
from myTable 
where '12345678' like start+'%' 
order by start desc 

また、開始列にインデックスを追加します。

+0

これはおそらくパフォーマンスを向上させません。 *プレフィックス検索ではなく、すべての行を検索して引数を作成し、文字列にマッチさせる必要があります。これはレンジ・サーチではないため、インデックスを使用することはできません –

+0

一般に、列に任意の操作を適用すると、各行に対して新しい値を計算する必要があるため、クエリオプティマイザはインデックスを使用できなくなります。 –

+0

@PanagiotisKanavos、ただし(*は "LIKE" 12345678% "で始まります)は結果自体を返しません –

関連する問題