当前位置: 首页 > 知识库问答 >
问题:

PostgreSQLUUID类型性能

权胜泫
2023-03-14

我不想重新开始UUID与串行整数密钥的争论。我知道双方都有正确的观点。我在几个表中使用UUID作为主键。

  • 列类型:"uuidKey"text Not NULL
  • 索引:使用btree("uuidKey")创建唯一索引grand_pkey
  • 主键约束:添加约束grand_pkey主键("uuidKey");

这是我的第一个问题;使用PostgreSQL 9.4,将列类型设置为UUID是否有任何性能优势?

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

提示:这三种类型之间没有性能差异,除了使用空白填充类型时增加了存储空间,并且在存储到长度受限列中时需要额外的CPU周期来检查长度。虽然字符(n)在其他一些数据库系统中具有性能优势,但PostgreSQL中没有这样的优势;事实上,字符(n)通常是三个字符中最慢的,因为它有额外的存储成本。在大多数情况下,应改为使用文本或字符变化。

我不担心磁盘空间,我只是想知道是否值得花时间对UUID和文本列类型进行基准测试?

第二个问题,hash vs b树索引。对UUID键进行排序毫无意义,那么b树相对于哈希索引还有其他优势吗?

共有2个答案

相野
2023-03-14

<code>UUID</code>是一个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

更小的表导致更快的操作。

阮喜
2023-03-14

我们有一个大约有30k行的表(由于一个特定的无关架构原因),其中UUID存储在一个文本字段中并被索引。我注意到查询性能比我预期的要慢。我创建了一个新的UUID列,复制到文本UUID主键中,并在下面进行了比较。2.652毫秒对0.029毫秒。非常不同!

 -- 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
 类似资料:
  • 我试图将PostgreSQL(9.4)UUID绑定到每个UUID周围的包装类数组。请注意,这些包装器在整个应用程序中都是集成的,因此删除它们不是一个选项。我正在使用jOOQ和它的maven插件(3.5.1)来生成PoJo、记录和表类。 我在绑定数据库模式时遇到问题的相关部分如下所示: 然后,我尝试使用forcedType元素转换该类,但它生成的类无法编译。放弃这一点,我只是将它们作为UUID生成,

  • 您好,我正在建立一个动物园微服务,包括动物、员工、客户和价格表。我的动物微服务可以工作,但在我的员工微服务中,我遇到了一个错误,即没有为类型“EmployeeModel”找到属性“name”。在问这个问题之前,我已经在网上搜索了几个小时,还有一些类似的问题。我在模型中没有“名字”employee_name,我只是感到困惑,不知道如何修复它。任何指导/建议/信息将不胜感激:)第一次发布,所以我希望我

  • TypeScript里的类型兼容性是基于结构子类型的。 结构类型是一种只使用其成员来描述类型的方式。 它正好与名义(nominal)类型形成对比。(译者注:在基于名义类型的类型系统中,数据类型的兼容性或等价性是通过明确的声明和/或类型的名称来决定的。这与结构性类型系统不同,它是基于类型的组成结构,且不要求明确地声明。) 看下面的例子: interface Named { name: str

  • Java常用的库包括和(我还看到)。还有其他人吗?我什么时候用每一个?有时我使用只是为了对我的简单数字感觉更好。事实证明,实际上允许您选择生成器。我该如何和什么时候使用这个? 最后,Java8提供了。我不知道这是什么,但它比以前的任何一个都要慢得多。应该如何以及何时使用?还有,慢是不是因为噪声源快用完了?

  • TypeScript里的类型兼容性基于结构子类型的。 结构类型是只一种只使用其成员来描述类型的方式。 它正好与名义类型形成对比。 看下面的例子: interface Named { name: string; }class Person { name: string; }var p: Named; // OK, because of structural typing p = ne

  • 是否有任何方法可以在模型部分定义HashMap或泛型对象类型?我有一个返回产品的REST服务,这些产品可以有不同的选择。options属性基本上是一个HashMap,其中id是选项名,其值是选项值。