2016-12-27 1 views
2

私はSQL Serverのデータベース列に格納する必要がある文字列 "key"を持っています。このキーは、任意のサイズのトークンのドット区切りリストです。例:左からワイルドカード検索を最適化するために、SQL Serverの文字列値をどのようにインデックスできますか?

keanu 
2016.sucked 
foo.bar.baz 
the.cake.is.a.lie 

私は左からトークンの任意の集合によって行を検索する必要があります。 (もちろん、その最後の1は、全体のトークンである)

foo 
foo.bar 
foo.bar.baz 

:だから、私はを開始すべてのトークンを検索したい場合があります。

私はSQLでこれを行う方法を知っている唯一の方法は、LIKE演算子である:

SELECT * FROM [table] WHERE key LIKE 'foo.%' 

、これはどのように悪いのですか? LIKEはパフォーマンスの問題で評判が高いですが、私は常に文字列の左端から検索していますので、右端を無期限にしておきます - それは役に立ちますか?

は、私はこのような何かを行うにつかの間のアイデアだった:

| key   | base1 | base2 | base3  | 
|-------------|-------|----------|-------------| 
| foo.bar.baz | foo. | foo.bar. | foo.bar.baz | 

もちろん、私はひどいですbaseX、のためにN個の列を持っている必要があるだろうが、それは速いだろうは間違いありません。

単純なVARCHARフィールドを使用すると仮定して、ここに100万行のデータが入ると、このフィールドにインデックスを作成して許容範囲にする方法はありますか?

+0

ノンクラスタードインデックスを作成するだけで、右側に '%'がある限り、順序スキャンが実行されます。 n個の列を作成するという考え方は、多くのレベルで悪いので、今すぐ忘れてください。 – dean

+2

'key like 'foo。%' 'を使うと' key' *のインデックスを利用できます。これは、SARGableではなくなるような主要なワイルドカードがある場合にのみです – alroc

+0

** 2016.sucked ** lol;) –

答えて

2

いいえ、検索文字列の先頭にワイルドカードがないため、クエリが不可能になります。キー値自体の最初の文字が分からないので、結果を見つけるためにはすべてのページをスキャンする必要があります。

しかし、私たちは開始文字を知っているので、キー値の中間ノードはBツリーのルートから見つけることができます。 key列にNon clustered Indexを作成すると役立ちます。以下のクエリはまだ有効です

SELECT * FROM [table] WHERE key LIKE 'foo.%' 
関連する問題