sql >> Database >  >> RDS >> PostgreSQL

Zal UUID als primaire sleutel in PostgreSQL slechte indexprestaties geven?

(Ik werk aan Heroku Postgres)

We gebruiken UUID's als primaire sleutels op een paar systemen en het werkt geweldig.

Ik raad je aan om de uuid-ossp . te gebruiken extensie, en laat zelfs postgres UUID's voor u genereren:

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 prestatie-implicaties

Het zal altijd afhankelijk van uw werkdruk.

De primaire sleutel met een geheel getal heeft het voordeel van een locatie waar like-data dichter bij elkaar staan. Dit kan handig zijn voor bijvoorbeeld:bereiktype zoekopdrachten zoals WHERE id between 1 and 10000 hoewel slotconflict erger is.

Als uw leeswerkbelasting volledig willekeurig is, omdat u altijd de primaire sleutel opzoekt, zou er geen meetbare prestatievermindering moeten zijn:u betaalt alleen voor het grotere gegevenstype.

Schrijf je veel naar deze tafel en is deze tafel erg groot? Het is mogelijk, hoewel ik dit niet heb gemeten, dat er implicaties zijn bij het handhaven van die index. Voor veel datasets zijn UUID's echter prima, en het gebruik van UUID's als identifiers heeft een aantal mooie eigenschappen.

Ten slotte ben ik misschien niet de meest gekwalificeerde persoon om hierover te discussiëren of advies te geven, omdat ik nog nooit een tafel heb gehad die groot genoeg is met een UUID PK waar het een probleem is geworden. YMMV. (Dat gezegd hebbende, ik hoor graag van mensen die problemen hebben met de aanpak!)



  1. Gebruik OBJECTPROPERTY() om erachter te komen of een object een CHECK-beperking is in SQL Server

  2. Hoe mySQL-database te verbinden met C++

  3. Tien tips voor het bereiken van MySQL- en MariaDB-beveiliging

  4. Hoe zoek ik in een SQL Server-database naar een tekenreeks?