PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Akankah UUID sebagai kunci utama di PostgreSQL memberikan kinerja indeks yang buruk?

(Saya bekerja di Heroku Postgres)

Kami menggunakan UUID sebagai kunci utama pada beberapa sistem dan berfungsi dengan baik.

Saya sarankan Anda menggunakan uuid-ossp ekstensi, dan bahkan postgres membuat UUID untuk Anda:

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 implikasi kinerja

Itu akan selalu tergantung pada beban kerja Anda.

Kunci utama bilangan bulat memiliki keunggulan lokalitas di mana data serupa berada lebih dekat. Ini dapat membantu misalnya:kueri jenis rentang seperti WHERE id between 1 and 10000 meskipun pertikaian kunci lebih buruk.

Jika beban kerja baca Anda benar-benar acak karena Anda selalu melakukan pencarian kunci utama, seharusnya tidak ada penurunan kinerja yang terukur:Anda hanya membayar untuk tipe data yang lebih besar.

Apakah Anda banyak menulis ke tabel ini, dan apakah tabel ini sangat besar? Ada kemungkinan, meskipun saya belum mengukur ini, bahwa ada implikasi dalam mempertahankan indeks itu. Untuk banyak set data, UUID baik-baik saja, dan menggunakan UUID sebagai pengidentifikasi memiliki beberapa properti yang bagus.

Akhirnya, saya mungkin bukan orang yang paling memenuhi syarat untuk membahas atau memberi saran tentang ini, karena saya tidak pernah menjalankan meja yang cukup besar dengan UUID PK yang menjadi masalah. YMMV. (Karena itu, saya ingin mendengar orang-orang yang mengalami masalah dengan pendekatan ini!)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gabungkan beberapa baris hasil dari satu kolom menjadi satu, kelompokkan dengan kolom lain

  2. Apakah ada cara untuk memuat data teks ke database di PostgreSQL?

  3. perhitungan persentil ke-n di postgresql

  4. Mengabaikan zona waktu sama sekali di Rails dan PostgreSQL

  5. Tentukan nama tabel dan kolom sebagai argumen dalam fungsi plpgsql?