PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy UUID jako klucz podstawowy w PostgreSQL da złą wydajność indeksu?

(Pracuję nad Heroku Postgres)

Używamy identyfikatorów UUID jako kluczy podstawowych w kilku systemach i działa to świetnie.

Polecam użyć uuid-ossp rozszerzenie, a nawet postgres generuje dla Ciebie identyfikatory UUID:

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)

Wpływ na wydajność EDYTUJ

Będzie zawsze zależą od obciążenia pracą.

Klucz podstawowy liczby całkowitej ma zaletę lokalizacji, w której podobne dane znajdują się bliżej siebie. Może to być pomocne np. w przypadku zapytań o zakres, takich jak WHERE id between 1 and 10000 chociaż rywalizacja o blokadę jest gorsza.

Jeśli obciążenie odczytu jest całkowicie losowe, ponieważ zawsze wykonujesz wyszukiwanie klucza podstawowego, nie powinno być żadnego mierzalnego spadku wydajności:płacisz tylko za większy typ danych.

Dużo piszesz do tego stołu i czy ten stół jest bardzo duży? Możliwe, chociaż tego nie mierzyłem, że istnieją konsekwencje w utrzymaniu tego wskaźnika. W przypadku wielu zestawów danych identyfikatory UUID są w porządku, a używanie identyfikatorów UUID jako identyfikatorów ma kilka fajnych właściwości.

Wreszcie, mogę nie być najbardziej wykwalifikowaną osobą do omawiania lub udzielania porad na ten temat, ponieważ nigdy nie prowadziłem wystarczająco dużego stołu z UUID PK, w którym stało się to problemem. YMMV. (Mając to, chciałbym usłyszeć o ludziach, którzy mają problemy z podejściem!)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL jak połączyć wartość interwału '2 dni'

  2. Znajdź rozmiar wiersza w bajtach w PostgreSQL

  3. Wypełnianie pola Many2many (odoo 8)

  4. Kontener Dockera dla Postgres 9.1 nie ujawnia portu 5432 hostowi

  5. Czas Postgresa z równością stref czasowych