2009-03-30 4 views
5

私は、PostgreSQL 8.3.3のタイプcharacter varying(256)のカラムで正規表現マッチを実行しています。列には現在インデックスがありません。可能であれば、このクエリのパフォーマンスを改善したいと思います。PostgreSQL 8で正規表現クエリのパフォーマンスを改善する方法はありますか?

インデックスを追加しますか?パフォーマンスを向上させるのに役立つ他のことはありますか?

+0

正規表現がどのように見えるかについての詳細は参考になります。また、あなたのコラムのようなデータは何ですか? –

+0

フィールドが正規表現と一致するかどうかを返す関数(および機能インデックス)を作成します。新しいフィールド/テーブルまたはトリガーを作成する必要はありません。 – MkV

答えて

5

汎用正規表現を高速化するインデックスを作成することはできません。ただし、一致する正規表現が1つまたは制限されている場合は、いくつかのオプションがあります。

Paul Tomblinが言及しているように、追加の列を使用して、指定された行がその正規表現または正規表現と一致するかどうかを示すことができます。その列は索引付けされ、効率的に照会できます。

this paperは、正規表現の長い部分文字列を検索し、それらがテキスト内に存在して候補の一致を生成するかどうかに基づいて索引付けすることを含む、正規表現に対する索引付けの興味深い発音手法について説明します。正規表現をチェックするために実際に必要な行数がフィルタリングされます。 GiSTインデックスを使用してこれを実装することもできますが、これは自明ではありません。

4

インデックスは正規表現では何もできません。あなたは完全なテーブルスキャンをしなければならないでしょう。

可能であれば、同じ正規表現を常に照会している場合と同じように、この行がその正規表現と一致するかどうかを指定する列を追加して、挿入や更新でそれを維持することができます。

0

正規表現のマッチはかなり大きなテキスト列ではうまく機能しません。正規表現なしでこれを達成しようとするか、データセットが大きくない場合はコード内で一致させてください。

0

これは、RegExを使用したくない場合の1つです。あなたのreg-exコードはどのように見えますか?多分、それはそれをスピードアップする方法です。

0

限定された正規表現がある場合は、テーブルのプライマリキーとその正規表現と一致するかどうかを示すフィールドを作成できます。この正規表現は、トリガで更新してテーブルのインデックスを作成しますそのテーブルにこれにより、更新速度と挿入速度が少し低下し、おそらく選択速度が大幅に向上します。

また、フィールドをその正規表現と比較する関数を書くこともできます(関数にマッチするフィールドとともに正規表現を渡すこともできます)。これはまた、固定正規表現のセットを前提としています(ただし、この方法で新しい正規表現マッチを簡単に追加できます)。

正規表現を動的ユーザー入力から作成された場合は、フィールドにインデックスを使用する「値%」、などのフィールドのような、より単純な検索を生成するためにテーブルスキャンと一緒に暮らすか、ユーザーのアプリケーションを変更する必要があります('%value%'はそうではありません)。

0

単純なLIKEクエリを必要としないように管理している場合は、text_pattern_opsで索引を参照してそれらの処理速度を上げます。

関連する問題