PostgreSQL UUID类型性能

44

我不想重新启动 UUID vs serial integer 键的辩论。我知道双方都有合理的观点。我在我的几个表中将 UUID 用作主键。

  • 列类型:"uuidKey" text NOT NULL
  • 索引:CREATE UNIQUE INDEX grand_pkey ON grand USING btree ("uuidKey")
  • 主键约束:ADD CONSTRAINT grand_pkey PRIMARY KEY ("uuidKey");

这是我的第一个问题:在 PostgreSQL 9.4 中,将列类型设置为 UUID 有任何性能优势吗?

文档http://www.postgresql.org/docs/9.4/static/datatype-uuid.html描述了 UUID,但除了类型安全之外,使用此类型是否有其他好处,而不是text类型?在字符类型文档中,它指出char(n)在 PostgreSQL 中没有任何优势,与text相同。

  

提示:除了使用空格填充的类型时增加存储空间,以及在存储到长度受限列时检查长度时增加一些额外的 CPU 周期外,这三种类型之间没有性能差异。虽然在一些其他数据库系统中,character(n) 具有性能优势,但在 PostgreSQL 中并不存在这种优势;事实上,由于其额外的存储成本,character(n) 通常是三种类型中最慢的。在大多数情况下,应该使用 text 或 character varying。

我不担心磁盘空间,我只想知道是否值得花时间对比 UUID 和 text 列类型?

第二个问题,哈希 vs B 树索引。没有必要对 UUID 键进行排序,那么 B 树索引除了哈希索引之外还有其他优点吗?


如果您除了主键之外还要创建唯一索引,则不必要这样做。当您设置主键时,会在该键上创建唯一索引。 - Clodoaldo Neto
我可能以错误的顺序展示了它。索引是由主键约束自动创建的。 - adamek
根据文档(在本评论时9.4是最新的稳定版本),似乎不鼓励使用哈希索引:http://www.postgresql.org/docs/9.4/static/indexes-types.html - AJ Venturella
也许我对这篇文章有所误解,但是既然Postgres有本地的UUID列类型,为什么要使用TEXT呢? TEXT有任何好处吗? - LaVache
2
UUID列类型是在9.0版本中添加的。这个数据库是在8版本中创建的。 - adamek
2个回答

67
我们有一张大约有30k行的表格,由于某种无关的架构原因,在一个文本字段中存储并索引UUID。我注意到查询性能比我预期的要慢。我创建了一个新的UUID列,复制了文本UUID主键并进行了比较。2.652ms与0.029ms之间有很大的差异!
 -- With text index
    QUERY PLAN
    Index Scan using tmptable_pkey on tmptable (cost=0.41..1024.34 rows=1 width=1797) (actual time=0.183..2.632 rows=1 loops=1)
      Index Cond: (primarykey = '755ad490-9a34-4c9f-8027-45fa37632b04'::text)
    Planning time: 0.121 ms
    Execution time: 2.652 ms

    -- With a uuid index 
    QUERY PLAN
    Index Scan using idx_tmptable on tmptable (cost=0.29..2.51 rows=1 width=1797) (actual time=0.012..0.013 rows=1 loops=1)
      Index Cond: (uuidkey = '755ad490-9a34-4c9f-8027-45fa37632b04'::uuid)
    Planning time: 0.109 ms
    Execution time: 0.029 ms

54

UUID是一个16字节的值,与text相同,它是一个32字节的值。存储大小如下:

select
    pg_column_size('a0eebc999c0b4ef8bb6d6bb9bd380a11'::text) as text_size,
    pg_column_size('a0eebc999c0b4ef8bb6d6bb9bd380a11'::uuid) as uuid_size;
 text_size | uuid_size 
-----------+-----------
        36 |        16

小表格可以使操作更快。


但是当涉及到UUID比较时,它会如何反应?使用UUID是否比使用整数有任何好处? - Rahul Jha
MAX(uuid_column)不受支持,因此这是一个真正的区别。 - Allain Lalonde
1
@AllainLalonde 你为什么想要那个? - Navin
可以在这里找到有关max(uuid)的讨论:https://dba.stackexchange.com/questions/275251/why-is-there-no-maxuuid-minuuid-function/305274#305274 - 这里有一些用例,它可以很容易地作为聚合函数添加。 - scravy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接