Saya sudah memiliki beberapa juta baris di basis data saya. Saya tidak tahu tentang tipe data PostgreSQL UUID ketika saya merancang skema saya.
Salah satu tabel memiliki 16 juta baris (sekitar 3,5 juta hingga 4 juta catatan per pecahan), tumbuh sekitar 500 ribu rekor per hari. Saya masih memiliki kemewahan untuk menurunkan sistem produksi selama beberapa jam jika diperlukan. Saya tidak akan memiliki kemewahan ini dalam satu atau dua minggu.
Pertanyaan saya adalah, apakah akan bermanfaat untuk melakukannya? Saya bertanya-tanya tentang kinerja BERGABUNG, penggunaan ruang disk (dump gzip'd penuh adalah 1,25 GiB), hal-hal semacam itu.
Skema tabel adalah:
# \d twitter_interactions
Table "public.twitter_interactions"
Column | Type | Modifiers
-------------------------+-----------------------------+-----------
interaction_id | character(36) | not null
status_text | character varying(1024) | not null
screen_name | character varying(40) | not null
twitter_user_id | bigint |
replying_to_screen_name | character varying(40) |
source | character varying(240) | not null
tweet_id | bigint | not null
created_at | timestamp without time zone | not null
Indexes:
"twitter_interactions_pkey" PRIMARY KEY, btree (interaction_id)
"twitter_interactions_tweet_id_key" UNIQUE, btree (tweet_id)
"index_twitter_interactions_on_created_at" btree (created_at)
"index_twitter_interactions_on_screen_name" btree (screen_name)
Triggers:
insert_twitter_interactions_trigger BEFORE INSERT ON twitter_interactions FOR EACH ROW EXECUTE PROCEDURE twitter_interactions_insert_trigger()
Number of child tables: 9 (Use \d+ to list them.)
sumber
Saya bukan orang postgres dengan imajinasi apa pun, tetapi berdasarkan apa yang saya ketahui dari SQL Server, semakin banyak baris yang dapat Anda masukkan ke halaman data, semakin baik kinerja yang akan Anda miliki (membaca data dari disk biasanya operasi paling mahal). Dengan demikian, akan dari 36 ish 1 byte lapangan luas untuk 16 byte GUID tampaknya penghematan biaya lurus ke depan. Semakin sedikit bacaan yang dapat Anda keluarkan, semakin cepat Anda dapat mengembalikan hasilnya. Semua ini tentu saja mengasumsikan bahwa GUID / UUID memenuhi kebutuhan bisnis tabel. Jika memenuhi UUID itu, akan sebuah bigint ? Itu lebih jauh mencukur biaya penyimpanan Anda 8 byte per baris.
Edit 1
Untuk data karakter di Postgres, ada biaya penyimpanan tambahan untuk mereka. String pendek, di bawah 127 byte memiliki overhead 1 byte sementara yang lebih lama memiliki 4 byte, yaitu bagaimana responden kedua menghasilkan biaya 40 byte untuk bidang 36 byte. Tetapi ada juga opsi untuk kompresi string jadi mungkin tidak akan dikenakan biaya 40 penuh. Saya tidak tahu berapa biaya finalnya tetapi fundamental tetap: apa pun lebih dari 16 byte akan meningkatkan biaya penyimpanan, butuh waktu lebih lama untuk membaca dari dan mengkonsumsi lebih banyak memori.
sumber
Selain masalah ruang, perlu diingat bahwa Anda harus mengubah setiap tabel untuk menggunakan tipe data yang benar atau kinerja gabungan Anda akan menurun.
sumber
Selain penghematan dalam ukuran data dan indeks (seperti yang dikatakan oleh orang lain), yang tidak berarti penghematan I / O, hal yang perlu Anda pertimbangkan adalah bagaimana Anda akan menghasilkan nilai baru untuk
interaction_id
dan apa dampaknya pada indeks dan kondisi permintaan (bergabung).Untuk indeks - ini akan lebih kecil, namun jika banyak pertanyaan Anda menggunakan pemindaian indeks, beralih ke UUID mungkin membuat pemindaian indeks menjadi tidak mungkin (tergantung pada bagaimana Anda akan menghasilkan UUID) dan
bigint
mungkin merupakan pilihan yang jauh lebih baik.Akhirnya, karena dampak kinerja aktual tergantung juga pada pola penggunaan dan distribusi data Anda, Anda harus menjalankan tes dan memiliki lingkungan pengembangan dan pengujian di mana Anda dapat menguji perubahan Anda.
Ini akan memberi Anda jawaban yang jauh lebih tepat tentang dampak pada kinerja.
sumber