PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

L'UUID en tant que clé primaire dans PostgreSQL donnera-t-il de mauvaises performances d'index ?

(Je travaille sur Heroku Postgres)

Nous utilisons les UUID comme clés primaires sur quelques systèmes et cela fonctionne très bien.

Je vous recommande d'utiliser le uuid-ossp extension, et même que postgres génère des UUID pour vous :

heroku pg:psql
psql (9.1.4, server 9.1.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

dcvgo3fvfmbl44=> CREATE EXTENSION "uuid-ossp"; 
CREATE EXTENSION  
dcvgo3fvfmbl44=> CREATE TABLE test (id uuid primary key default uuid_generate_v4(), name text);  
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_pkey" for table "test"
CREATE TABLE  
dcvgo3fvfmbl44=> \d test
                 Table "public.test"  
Column | Type |              Modifiers              
--------+------+-------------------------------------  
id     | uuid | not null default uuid_generate_v4()  name   | text |  
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)

dcvgo3fvfmbl44=> insert into test (name) values ('hgmnz'); 
INSERT 0 1 
dcvgo3fvfmbl44=> select * from test;
                  id                  | name  
--------------------------------------+-------   
 e535d271-91be-4291-832f-f7883a2d374f | hgmnz  
(1 row)

MODIFIER les implications sur les performances

Ce sera toujours dépendent de votre charge de travail.

La clé primaire entière a l'avantage de la localité où les données similaires sont plus proches les unes des autres. Cela peut être utile pour, par exemple :les requêtes de type plage telles que WHERE id between 1 and 10000 bien que le conflit de verrouillage soit pire.

Si votre charge de travail de lecture est totalement aléatoire, c'est-à-dire que vous effectuez toujours des recherches de clé primaire, il ne devrait pas y avoir de dégradation mesurable des performances :vous ne payez que pour le type de données le plus volumineux.

Écrivez-vous beaucoup sur ce tableau, et ce tableau est-il très grand ? Il est possible, bien que je n'aie pas mesuré cela, qu'il y ait des implications dans le maintien de cet indice. Pour de nombreux ensembles de données, les UUID sont très bien, et l'utilisation d'UUID comme identifiants a de belles propriétés.

Enfin, je ne suis peut-être pas la personne la plus qualifiée pour discuter ou donner des conseils à ce sujet, car je n'ai jamais exécuté une table assez grande avec un UUID PK où cela est devenu un problème. YMMV. (Cela dit, j'aimerais entendre parler de personnes qui rencontrent des problèmes avec l'approche !)