2009-05-06 8 views
6

私はいくつかの列を持つデータベーステーブルを持っています。それらのほとんどはVARCHAR(x)型の列です。これらの列の中にはインデックスがあり、その中のデータをすばやく検索できるようになっています。SQL Server; TEXT列のインデックス

ただし、非常に大量のデータ(平文ASCIIテキストなど23 KB)が含まれているため、列の1つがTEXT列です。私はその列(... WHERE col1 LIKE '%search string%'...)で検索することができるようにしたいが、現在はクエリを実行するために永遠に取っている。私はWHERE句からその条件を削除すると、クエリが完了した(私が考えると思う)ので、この列検索のためにクエリが遅いことがわかります。

SQL Server Management Studioのインデックスビルダー/ウィザードで、その列のオプションがグレー表示されているため、この列にインデックスを追加できません。

ここでは、その列でクエリの検索を高速化するためのオプションはありますか?

お時間をありがとう...

更新
OK]をので、私は、フルテキスト検索に見て、すべてのものをやった、そして今私はクエリを実行したいと思います。しかし、 "contains"を使用すると、1つの単語しか受け付けません。正確なフレーズが必要な場合はどうすればよいですか? ... WHERE CONTAINS (col1, 'search phrase') ...はエラーをスローします。

申し訳ありませんが、私は

SQL Serverへの新たなんだアップデート2 申し訳ありませんが、ちょうどそれを考え出しました。複数の単語を含む1つの句の代わりに、複数の「contains」句を使用します。実際には、これはまだ私が望むもの(正確なフレーズ)を得ることはできません。フレーズのすべての単語が存在することを確認するだけです。

答えて

9

TEXTフィールドの検索は、常にかなり遅いです。 Full Text Searchを試してみてください。

+0

+1:フルテキストが行く方法です - 確かに! –

+0

リンクはもう動作していません。可能であれば修正してください! – Andreas

+0

リンクは固定されました –

4

この列でフルテキストインデックスを使用することを検討する必要があります。

4

あなたのクエリがLIKE '%string%'ようにしている場合、あなたはFULLTEXTインデックスが必要になります(すなわち、あなたはTEXTフィールド内の文字列を検索します)。

あなたはフィールド(LIKE 'string%')の開始にサブを検索し、SQL Server 2005以上を使用する場合は、あなたがこの列を計算列やインデックスを作成、VARCHAR(MAX)にあなたのTEXTを変換することができます。

は、パフォーマンスの詳細については、私のブログにこの記事を参照してください。

0

あなたはFTSに複雑なブール照会を行うことができます。以下のような

クエリCONTAINSTABLEまたはFREETEXTTABLEによっては(yourcol、「『私の最初の刺し傷』や 『私の2番目の文字列』と 『私の3番目の文字列』」)

が含まれていますが、より良い結果を与えるかもしれません。

あなたはA google full text search

+0

私はあなたのバリエーションを試しましたが、それは動作しません。第1に、 'and not'を使用する必要があります.2番目または複数の単語を追加すると2番目または複数の単語が追加されません。 – user85116

+0

私の間違い1つが必要です最後に 構文はContainsです*またはcolname、 '"あなたのデータ"、 "その他のデータ") http://msdn.microsoft.com/en-us/library/ms187787.aspx – u07ch

0

で見たいと思うかもしれません。ネットを通って、誰もがすでにLIKE '%string%'は、既存のインデックスをバイパス照会(それは明らかだ多分ので)それを言っていないので、接続している場合 - それが遅い実行されます。 なぜフルテキストインデックスを使用する必要があるのですか? (Quassnoiが言ったことです)。

修正 - 私はこれを学んだと確信して、常にそれを信じています - しかし、それを調査した後(最初にワイルドカードを使用して)OKと思われますか?私の古い正規表現のクエリは好きなものとうまくいっています!

関連する問題