PostgresでUUIDをインデックスするにはどうすればよいですか?


26

私はPostgreSQLが初めてであり、データベース全般については多少新しいです。PostgresでUUID値をインデックスする方法の確立された方法はありますか?ハッシュを使用するかトライを使用するかは、自動的に使用する組み込みのものが既に存在しない限り、分割されます。私が使用するものはすべて、膨大な量のデータを処理します。

SP-GiST演算子ファミリ「text_ops」は、トライを使用してインデックスを作成します。UUIDは非常に長く、非常に異なるため、完全一致検索のみを行う場合でも、これらのサウンドは魅力的です。

ハッシュオプションもあります。ハッシュはO(1)であり、もちろん平等以外の比較を行う必要はありませんが、UUIDは非常に長いため、ハッシュからハッシュを生成すると多くの時間が浪費されるのではないかと心配しています。

または、これはシステムに依存しすぎて、仕様を使用するものですか?

ほとんどの場合、bigserialを使用したいのですが、これにはuuidを使用するように言われました。異なるデータベースを使用する複数のサーバーが存在する可能性があるため、uuidが必要です。したがって、一意のbigintがあることを保証するものではありません。サーバーごとに異なるシーケンス(およびシード)を使用できますが、それでもUUIDほど柔軟ではありません。たとえば、IDとその参照をどこでも変換しないと、データベースエントリをあるサーバーから別のサーバーに移行することはできません。


2
私は信じている「フェデレーテッド・データベースは、」状況に流行語です。そして、はい、UUIDはその解決策です。それが、UUIDが数十年前に発明されたまさにその理由でした。集中化された調整なしに分散システム間でデータを共有するためです。
バジルブルク

数ヶ月後:実際、バジル・ブルクが育てた「連合データベース」が私たちの目的です。複数のサーバーがあるだけでなく、オフライン中にIDを作成するクライアント(フェデレーションDBのより多くの部分と考えることができる)もあります。それが、UUIDを使用する理由です。
須藤

回答:


31

PostgreSQLの組み込みuuidデータ型使用し、その上に通常のBツリーインデックスを作成します。

特別なことをする必要はありません。これにより、最適なインデックスが得られ、uuid現在実用的であるほどコンパクトなフォームにフィールドが格納されます。

(バージョン10より前のPostgreSQLのハッシュインデックスはクラッシュセーフではなく、実際にはbツリーよりもパフォーマンスが低下する傾向のある歴史的な遺物でした。それらを避けてください。PostgreSQL10ではクラッシュセーフになり、パフォーマンスの改善が行われたため、検討することをお勧めします。)

何らかの理由でuuidタイプを使用できなかった場合、通常はテキスト表現またはできればbyteaUUIDの表現にBツリーを作成します。


2
hash対インデックスに関する声明はb-tree一般的に信じられている信念ですが、そのような主張の出典を引用することは有益だと思います。
ボルテ

1
PostgreSQL 10以降、hashインデックスはクラッシュセーフになりました。とはhashいえ、インデックスはでのみ使用できる=ため、他の演算子が必要な場合b-treeは、依然として望ましいです。
リンタウン

1
数年後、私の経験でhashb-tree、Postgres 10でさえも、よりも速くはありませんでした。しかし、ハッシュインデックスはbツリーよりもはるかに少ないディスクスペースしか必要としないため、大きなインデックスが問題は、私には当てはまらなかったと感じています。v10で実際にそれらを安全に使用できるようになったので、目を光らせておきます。
sudo

ハッシュインデックスにいくつかの良い書き込みアップはV10とV11の改善PERFありますrhaas.blogspot.com/2017/09/... - amitkapila16.blogspot.com/2017/03/...
グレン・モートン

3

PostgreSQLでのハッシュインデックスの動作が欠落しています。PostgreSQLは、ハッシュインデックスが必要であり、ハッシュインデックスのコードは古くてカビが生えていることを知っていますが、誰かがやって来てハッシュインデックスをオーバーホールするのを待っているので、削除しません。このスレッドを参照してください:

http://www.postgresql.org/message-id/4407.1115698257@sss.pgh.pa.us


ハッシュインデックスを使用しようとすると警告が表示されます。「非常に落胆」または何か。
須藤

ハッシュインデックスは、特定の状況下でPostgreSQLでうまく機能しますが、最近、組み込みUUIDデータ型のプライマリキーと外部キーでハッシュインデックスを使用して最適化しようとすると、クエリが結果を返さないことがわかりました。ハッシュインデックスには本当に利点があります。すべてのデータ型で機能し、PostgreSQL開発者がこれを知っていて、それを修正するのが面倒で、最終的に/のために祈っているかのようにコードを保持している場合救世主。
-derekm

2
:誰かがPG10は、に焦点を当ててきたハッシュインデックス、彼らはデータ分割において重要な役割を果たしているので、私は推測している、救出しているwiki.postgresql.org/wiki/...しかし、彼らはまだあなたに私が理論的に見てきたすべてのものを与えていないが大学のデータベースクラスで役立ちます;)
sudo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.