sql >> Databasteknik >  >> RDS >> PostgreSQL

Kommer UUID som primärnyckel i PostgreSQL att ge dålig indexprestanda?

(Jag jobbar på Heroku Postgres)

Vi använder UUID som primärnycklar på ett fåtal system och det fungerar utmärkt.

Jag rekommenderar att du använder uuid-ossp förlängning, och till och med få postgres att generera UUID för dig:

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)

EDIT prestandakonsekvenser

Det kommer alltid beror på din arbetsbelastning.

Heltalsprimärnyckeln har fördelen av lokalitet där like-data sitter närmare varandra. Detta kan vara användbart för t.ex.:intervalltypsfrågor som WHERE id between 1 and 10000 även om låsstriden är värre.

Om din läsarbetsbelastning är helt slumpmässig genom att du alltid gör primärnyckelsökningar, bör det inte finnas någon mätbar prestandaförsämring:du betalar bara för den större datatypen.

Skriver du mycket till det här bordet, och är det här bordet väldigt stort? Det är möjligt, även om jag inte har mätt detta, att det finns implikationer av att upprätthålla det indexet. För många datauppsättningar är UUID:n dock bra, och att använda UUID som identifierare har några bra egenskaper.

Slutligen är jag kanske inte den mest kvalificerade personen att diskutera eller ge råd om detta, då jag aldrig har kört ett bord som är tillräckligt stort med en UUID PK där det blivit ett problem. YMMV. (När det är sagt skulle jag gärna höra om människor som stöter på problem med tillvägagångssättet!)



  1. Hur installerar man Python MySQLdb-modulen med pip?

  2. Intermittenta ODBC-anslutningsfel

  3. Hur lägger man till inledande nolla i ett nummer i Oracle SQL-fråga?

  4. ExecuteNonQuery för SELECT SQL-sats som returnerar inga rader