sql >> Databáze >  >> RDS >> PostgreSQL

Poskytne UUID jako primární klíč v PostgreSQL špatný výkon indexu?

(Pracuji na Heroku Postgres)

Na několika systémech používáme UUID jako primární klíče a funguje to skvěle.

Doporučuji použít uuid-ossp a dokonce nechat postgres vygenerovat pro vás 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)

UPRAVIT důsledky pro výkon

Bude vždy závisí na vaší pracovní zátěži.

Celočíselný primární klíč má výhodu umístění, kde jsou podobná data blíže u sebe. To může být užitečné např. pro:dotazy typu rozsah, jako je WHERE id between 1 and 10000 i když spor o zámek je horší.

Pokud je vaše zátěž při čtení zcela náhodná v tom, že vždy provádíte vyhledávání primárního klíče, nemělo by docházet k žádnému měřitelnému snížení výkonu:platíte pouze za větší datový typ.

Píšete hodně do této tabulky a je tato tabulka hodně velká? Je možné, i když jsem to neměřil, že existují důsledky pro udržování tohoto indexu. Pro mnoho datových sad jsou však UUID v pořádku a použití UUID jako identifikátorů má některé pěkné vlastnosti.

A konečně, možná nejsem nejkvalifikovanější osoba, která by o tom mohla diskutovat nebo radit, protože jsem nikdy neprovozoval dostatečně velkou tabulku s UUID PK, kde by se to stalo problémem. YMMV. (Když už to bylo řečeno, rád bych slyšel o lidech, kteří mají s tímto přístupem problémy!)



  1. Technické srovnání:Microsoft Access 2016 vs SQL Server 2016

  2. Jak vypsat všechny tabulky v Oracle

  3. DROP INDEX MySQL

  4. nelze odstranit objekt kvůli omezení cizího klíče