UUID: Universally Unique Identifiers (UUID)
· Defined by RFC 4122, ISO/IEC 9834-8:2005, and related standards
· Known as globally unique identifier, or GUID
· Example: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
· Length in Text: 36 characters
· Storage in UUID: 32 digits = 128bits = 16bytes
Bigserial:
· Same as “SERIAL8”
· Range : 1 - 9223372036854775807
· “create table t (id bigserial)” same as:
o create sequence t_id_seq;
o create table t(id bigint not null default nextval('t_id_seq’));
o alter sequence t_id_seq owned by t.id;
Install Extension:
create extension if not exists "uuid-ossp";
mytest=> \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+--------------------+------------------+---------------------------+------
public | uuid_generate_v1 | uuid | | func
public | uuid_generate_v1mc | uuid | | func
public | uuid_generate_v3 | uuid | namespace uuid, name text | func
public | uuid_generate_v4 | uuid | | func
public | uuid_generate_v5 | uuid | namespace uuid, name text | func
public | uuid_nil | uuid | | func
public | uuid_ns_dns | uuid | | func
public | uuid_ns_oid | uuid | | func
public | uuid_ns_url | uuid | | func
public | uuid_ns_x500 | uuid | | func
Insert Performance:
create table t1(c1 uuid primary key, c2 char(100));
create table t2(c1 char(36) primary key, c2 char(100));
create table t3(c1 bigserial primary key, c2 char(100));
mytest=> insert into t1 select uuid_generate_v4(),'x' from generate_series(1,1000000);
INSERT 0 1000000
Time: 8165.939 ms (00:08.166)
mytest=> insert into t2 select uuid_generate_v4(),'x' from generate_series(1,1000000);
INSERT 0 1000000
Time: 12102.101 ms (00:12.102)
mytest=> insert into t3(c2) select 'x' from generate_series(1,1000000);
INSERT 0 1000000
Time: 5617.863 ms (00:05.618)
Storage Comparison:
mytest=> \di+
List of relations
Schema | Name | Type | Owner | Table | Persistence | Size | Description
--------+---------+-------+----------+-------+-------------+-------+-------------
public | t1_pkey | index | postgres | t1 | permanent | 38 MB |
public | t2_pkey | index | postgres | t2 | permanent | 73 MB |
public | t3_pkey | index | postgres | t3 | permanent | 21 MB |
(3 rows)
select * from (
(select pg_column_size(c1) as "t1.c1" from t1 limit 1) as a1 cross join
(select pg_column_size(c1) as "t2.c1" from t2 limit 1) as a2 cross join
(select pg_column_size(c1) as "t3.c1" from t3 limit 1) as a3);
t1.c1 | t2.c1 | t3.c1
-------+-------+-------
16 | 37 | 8
Other Considerations:
• Large size could mean bloat, large WAL logs, more space in both storage and memory
• Randomization means more random IOs for the index, less efficient buffer cache as hot data spread evenly.
• Foreign Key (FK) Constraints usually reference to PK.
• Max(id) doesn’t make sense to you any more.