B-Tree と GiST インデックス メソッド (PostgreSQL の場合) の違いは何ですか?

StackOverflow https://stackoverflow.com/questions/766488

質問

私は最近 Postgres データベースの最適化に取り組んでいますが、これまでは B-Tree インデックスのみを使用してきました。ただし、Postgres 8.3 ドキュメントで、GiST インデックスが非一意の複数列インデックスをサポートしていることを確認しました。

ただし、それらの実際の違いが何であるかはわかりませんでした。私は、同僚のプログラマーが、両者の長所と短所、そしてさらに重要なことに、一方を他方よりも使用する理由を説明してくれるかもしれないと期待していました。

役に立ちましたか?

解決

は、一言で言えば:Bツリーインデックスは良好に機能するが、GiSTインデックスは、より柔軟です。彼らはあなたのデータタイプのために働くだろう場合は通常、あなたはBツリーインデックスをしたいです。 GiSTインデックスを使用するための巨大なパフォーマンスヒットについてPGリストの最近の投稿がありました。彼らは仕事が進行中、ご想像のとおり、ある... のことのはるかに遅い(例えば、柔軟性の価格です)B-木よりも遅くなると予想、しかししていない。

トム・レーンのことでポスト、コアのPostgreSQLから開発者:

  

GISTの主なポイントは、単に、あるインデックス照会することができることです   BTREEでの刃先交換式ではありません。 ...一つは、完全に希望   BTREEはBTREE、インデックス可能な場合のためにGISTを打つことを期待しています。私は思います   ここで重要な点は、それが夫婦のファクターで優勝だということです   百;それはかなりひどいです、といくつかの実装に指している可能性があります   問題ます。

他のヒント

GiST インデックスにはある程度損失があり、DBMS は次のような誤検知/誤検知に対処する必要があります。

各ドキュメントは固定長の署名によってインデックスに表されるため、GISTインデックスは損失です。署名は、各単語をnビット文字列のランダムビットにハッシュすることによって生成されます。これらすべてのビットは、nビットドキュメント署名を作成するためにOR-edを組み合わせて生成します。2つの単語が同じビット位置にハッシュすると、誤った一致があります。クエリ内のすべての単語が一致している場合(実際または偽)、テーブルの行を取得して、一致が正しいかどうかを確認する必要があります。B ツリーにはこの動作がないため、インデックス付けされるデータによっては、2 つの間にパフォーマンスの違いが生じる可能性があります。

テキスト検索の動作については、「」を参照してください。 http://www.postgresql.org/docs/8.3/static/textsearch-indexes.html そして http://www.postgresql.org/docs/8.3/static/indexes-types.html 一般的な目的の比較のため。

のGiSTより一般的な指標です。あなたはどれがあなたはBツリーで使用するより広範な目的のためにそれらを使用することができます。要点を使用してBツリーを構築する能力を含めます。

IE:Bツリーには問題だけの事が鍵となりますので、あなたは(、地理的ポイントのインデックス、または地域、あなたはBツリー・インデックスに関係することはできません何かに要旨を使用することができますかキー)あなたがインデックス化されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top