1

これは機能します:
SELECT * FROM aTable WHERE junk='foo bar';
これは永遠にハングします:
SELECT * FROM aTable WHERE junk~'foo bar';
これは永遠にハングします:
SELECT * FROM aTable WHERE junk~'foo b.*';
何が問題なのですか?

編集:SQLクエリが送信されても​​応答がないという状況はあります?たとえば、無限ループ、不正な構文など。

4

2 に答える 2

2

何も悪いことはありません。

正規表現を使用する2つのクエリはどちらも、インデックスを使用して最適化することはできません。

その結果、フルスキャンが実行されるため、時間がかかります。

于 2012-09-17T02:56:51.197 に答える
2

3つすべてが正しいですが、を使用してクエリプランを調べるEXPLAINと、プランが大きく異なることがわかります。

このSQLFiddleを参照してください-実行時間が異なることに注意してください。「ビュー実行プラン」を使用してクエリプランを調べます。

あなたの場合、=はおそらく単一の値に対してb-treeインデックスルックアップを使用していますが、これは非常に高速であるはずですが、~バージョンはおそらくシーケンシャルスキャンを実行しています-正規表現を試す必要があるため、CPUにかなりのコストがかかりますすべての行に対して。

便利なことに、私は別の投稿に答えてこれについて書いたところです。この回答を参照してください。これは、適切に作成されたインデックスLIKESIMILAR TO使用してプレフィックスを一致させることができますが、使用することは~できません。

CREATE INDEX atable_junk_txt_idx ON aTable(junk text_pattern_ops)のようにインデックスを作成してみてくださいLIKE 'foo b%'

インデックスを追加すると、挿入、更新、削除の速度が低下するため、必要のないインデックスを作成しないでください。

Pgwikiのexplainの使用を参照してください。

于 2012-09-17T03:09:37.557 に答える