web-dev-qa-db-ja.com

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

私はPostgreSQLを初めて使用し、データベース全般についてはやや新規です。 Postgresで [〜#〜] uuid [〜#〜] 値にインデックスを付ける方法は確立されていますか?ハッシュ関数を使用することと、トライを使用することは、自動的に使用される組み込みのものがない限り、分割されています。私が使用するものは何でも、膨大な量のデータを処理することになります。

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

ハッシュオプションもあります。ハッシュはO(1)であり、もちろん等号以外の比較を行う必要はありませんが、UUIDは非常に長いため、ハッシュを生成すると多くの時間が無駄になると思います。

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

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

27
sudo

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

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

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

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

32
Craig Ringer

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

http://www.postgresql.org/message-id/[email protected]

3
derekm