最も効率的なUUID列タイプは何ですか


15

128ビットUUIDを保存するには、複数の保存オプションがあります。

  1. byte [16]列
  2. 2つのbigint / long(64ビット)列
  3. CHAR(36)列-32桁の16進数+ 4つのダッシュ。
  4. dbがサポートしている場合、UUIDデータベース固有の列

インデックスの観点から、どれが最も効率的ですか?データベースが専用のuuidタイプをサポートしていない場合、1、2、3のうちどれが最適な候補ですか?


1
これは少し「依存」しています-実装の詳細がたくさんあります。
クレイグリンガー14年

2
私は絶対に選択しないでしょう。16でできるなら36バイトで何かを保存しないraw(16)でください。OracleとuuidPostgreSQLで使用しています。
コリン 'ハート14年

1
シンプルであるほど良い。
akuzminsky

uuid>> bytea>> textCHECK制約> varchar(36)>> char(36)dba.stackexchange.com/a/89433/3684およびdba.stackexchange.com/a/115316/3684を参照してください。
アーウィンブランドステッター

回答:


15

uuidPostgreSQLには、専用タイプが最善の策です。他のDBでは言いにくい- uuid単純なバイト型よりも効率的に格納されていない型を暗示することは不可能ではありません。

再びPostgreSQLではbyteauuid型がない場合にUUIDを格納するのに合理的な方法です。他のDBの場合、バイナリデータの保存方法に依存します。

可能であれば、hex-with-dashesの使用を強く避けます。比較、ソート、保存を行うのは効率的ではありません。

本当に、「(2)または(3)ではない」。今まで。サポートされている場合は(4)、それ以外の場合は(1)を使用します。


注意すべきことの1つは、PostgreSQLのUUIDタイプが配列でネイティブにサポートされていないか、これが修正されていることです?postgresql.org/message-id/...
クリストフRoussy

@ChristopheRoussyそれは2013年からです。それは小さな見落としでした。SELECT ARRAY['ef1e0638-072e-4caa-88b3-97bfa5b2e8c3']::uuid[]
クレイグリンガー

3

優先順位:4,1,2,3 SQLサーバーを使用する場合、UUIDをクラスタリングキーとして使用しない各インデックス行。断片化はNEWSEQUENTIALIDを使用して軽減できますが、通常は他のインデックスの膨張を防ぐために、GUIDよりもクラスタリングキーのbingint IDを優先します。

1から2を選択する場合の違いは、単一列固定配列よりもデータベースが基本型の2列をより効率的に処理できるかどうかに依存します。ダミーデータでテストするのに十分簡単なはずです。クエリの速度と、インデックスとデータのサイズを確認してください。Small + fastが最適です!


1

ネイティブにサポートされているデータ型は、その製品のクライアントとしてまとめることができるものよりも、製品で最適化されると想定する必要があります。その後、バイトカウントが最も小さいものであれば、ページごとに最大行を取得します。


本当ですが、重要なのはバイトサイズだけですか?タイプはインデックス作成アルゴリズムに影響しませんか?
ウラッドミハルセア14年

@Vlad SQL Serverを使用します。私の知る限り、Bツリー(または2104インメモリのハッシュインデックス)を構築するとき、すべてのデータ型は同じように処理されます。これをできる限り狭くするのには十分な理由があります。
マイケルグリーン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.