6

Postgres DB では、テーブル A 内の数十万行のセットをフィルタリングする必要があります。これには、行内の IP アドレス列 (タイプ inet) が数千の IP アドレス ブロック (タイプ inet) のいずれかに一致する行のみを含めます。最初のテーブルの inet アドレスと 2 番目のテーブルの cidr 範囲でさまざまなインデックスを試しましたが、何をしても、プランナーはネストされた順次スキャンを実行し、<< 演算子を適用しますIP アドレスとプレフィックスのすべてのペア。

インデックスやその他の巧妙なトリックでこれを高速化する方法はありますか? (外部の手続き型スクリプトに頼ることができますが、Postgres内で実行できるかどうか疑問に思っていました。)

ありがとう!

4

3 に答える 3

2

あなたはip4rを見ましたか? http://pgfoundry.org/projects/ip4r。IIRC、INET 関連のルックアップは非常に高速です。

于 2013-09-11T23:38:50.230 に答える
2

ケースを閉じました。高速化するには、次の手順を実行します。

  • ユーザー bma が指摘したように、 http: //pgfoundry.org/projects/ip4r から入手できる ip4r タイプを使用します。このタイプは、Postgres (Postgres 9.3 まで) のネイティブのものではサポートされないインデックス作成をサポートします。

  • ip4r タイプを直接使用しないでください。ただし、ユーザー caskey によって提案され、ip4r のドキュメントに記載されているように、下限値と上限値に展開してください: https://github.com/petere/ip4r-cvs/blob/master/README.ip4r# L187

上記を考慮して、比較するすべてのアドレスにタイプ ip4 (v4 アドレスを扱っていると仮定) を使用している場合、プランナーはそれらの列のインデックスを利用します。

助けてくれてありがとう、みんな!

于 2013-09-12T00:20:19.070 に答える