2012-04-27 13 views
1

整数列idにインデックスがあるとし、int列のregex検索を効率的に行いますか?

は、どのように私は、効率的にそのid試合%789%それらのレコードを見つけるのですか?

id LIKE '%789%'はインデックスを使用できなくなり、パフォーマンス上の問題が発生します。

効率的に仕事をするための秘訣はありますか?

+0

間違った質問をしていると思います。私はあなたがしようとしていると思われるものを達成するための、より洗練された、より効率的な方法があると思います。完全に基本的なレベルでは、あなたの仕様に準拠したものよりもすべての整数を含む1つのカラムだけのテーブルを持つことができます。ジョインでこのテーブルを使用するだけで、必要のない行がはるかに効率的に削除されます。 – aidan

答えて

0

convert(varchar(20)、int_column)のような計算カラムを作成し、そのインデックスを配置することができます。 int_columnに対してLIKE演算子を使用したい場合は、代わりに計算列に対して行うことになります。

+0

申し訳ありませんが、別の列を追加することは私の場合は受け入れられません。 –

0

あなたのパターンが実際に(%4%5%6%のようなものではなく)一緒にパックされている場合は、パターンを対応する整数比較に展開することを検討することもできます。それは実際にあなたのコードを爆発させるでしょうが、実際の検索をかなり高速化するはずです。

試してください:あなたのキーの範囲が制限されている知っていれば明らかに

mod(id, 1000) = 789 or 
(7890 <= mod(id, 10000) and mod(id, 10000) < 7900) or 
(78900 <= mod(id, 100000) and mod(id, 100000) < 79000) or 
(789000 <= mod(id, 1000000) and mod(id, 1000000) < 790000) or 
... 
(789000000 <= mod(id, 1000000000) and mod(id, 1000000000) < 790000000 

は、あなたが比較回数を減らすことができます。

+0

これは本当に最適化されていますか?私は、SQL Serverはまだすべての比較を行う**すべての**レコードを反復処理する必要があると思います。 –

+0

OPは、整数列のインデックスを持っていると言いました。整数インデックス上で整数比較を行うのはかなり速くなければなりません。 –

+0

さらにスキャンする行数を制限する方法はありますか? 'explain'が示すように、この種のSQLはまだすべての行をスキャンします。 –

関連する問題