sql >> Base de Datos >  >> RDS >> PostgreSQL

¿El UUID como clave principal en PostgreSQL dará un mal rendimiento del índice?

(Trabajo en Heroku Postgres)

Usamos UUID como claves principales en algunos sistemas y funciona muy bien.

Te recomiendo que uses el uuid-ossp extensión, e incluso hacer que postgres genere UUID para usted:

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)

EDITAR implicaciones de rendimiento

Será siempre depender de su carga de trabajo.

La clave primaria entera tiene la ventaja de la localidad donde los datos similares se encuentran más juntos. Esto puede ser útil para, por ejemplo:consultas de tipo de rango como WHERE id between 1 and 10000 aunque la contención de bloqueo es peor.

Si su carga de trabajo de lectura es totalmente aleatoria en el sentido de que siempre realiza búsquedas de clave principal, no debería haber ninguna degradación de rendimiento medible:solo paga por el tipo de datos más grande.

¿Escribes mucho en esta mesa, y esta mesa es muy grande? Es posible, aunque no lo he medido, que haya implicaciones en mantener ese índice. Sin embargo, para muchos conjuntos de datos, los UUID están bien, y usar UUID como identificadores tiene algunas buenas propiedades.

Finalmente, es posible que no sea la persona más calificada para discutir o aconsejar sobre esto, ya que nunca he ejecutado una tabla lo suficientemente grande con un UUID PK donde se haya convertido en un problema. YMMV. (Habiendo dicho eso, ¡me encantaría saber de personas que tienen problemas con el enfoque!)