Ya, saya sadar bahwa normalisasi data harus menjadi prioritas saya (sebagaimana adanya).
- Aku punya tabel dengan 65 kolom menyimpan data kendaraan dengan kolom:
used_vehicle
,color
,doors
,mileage
,price
dan sebagainya, total 65. - Sekarang, saya bisa membagi itu dan memiliki
Vehicle
meja,VehicleInterior
,VehicleExterior
,VehicleTechnical
,VehicleExtra
(semua satu-ke-satu dengan utamaVehicle
tabel).
Anggaplah saya akan memiliki sekitar 5 juta baris (kendaraan).
Aktif SELECT
dengan WHERE
klausa: Apakah kinerja akan lebih baik menelusuri (kedua kasus diindeks setidaknya pada IDs
):
Vehicle
tabel dengan 65 kolom atauVehicle
tabel denganJOINS
pada empat tabel lainnya (semua dengan 5 juta baris) untuk mengembalikan semua data yang terkaitVehicle
?
(Sesuai mesin database, pertimbangkan PostgreSQL dan / atau MySQL).
Benar-benar menghargai wawasan terperinci yang mungkin Anda miliki dari pengalaman sebelumnya?
postgresql
database-design
performance
partitioning
postgresql-performance
Urim Kurtishi
sumber
sumber
VehicleInterior
, kueri lain yang hanya menangani kolom dariVehicleTechnical
, dll. Atau jika ada banyak baris / kendaraan yang sama sekali tidak memiliki info tentang (misalnya)VehicleExtra
jadi alih-alih banyak baris dengan banyak nol di satu tabel, Anda memiliki baris di sisa tabel dan tidak ada baris diVehicleExtra
Jawaban:
Dengan asumsi kita berbicara tentang hubungan 1: 1 di antara semua tabel.
Penyimpanan keseluruhan praktis selalu (jauh) lebih murah dengan satu tabel daripada beberapa tabel dalam hubungan 1: 1. Setiap baris memiliki 28 byte overhead, ditambah biasanya beberapa byte lagi untuk padding tambahan. Dan Anda perlu menyimpan kolom PK di setiap meja. Dan memiliki indeks terpisah (redundan) pada masing-masing kolom ini ... Ukuran tidak masalah untuk kinerja.
Ini bahkan benar jika banyak kolom NULL di sebagian besar baris karena penyimpanan NULL sangat murah :
Sementara mengambil semua kolom satu tabel secara substansial lebih cepat dari 5 tabel yang bergabung bersama. Ini juga jauh lebih sederhana . Lima tabel mungkin sulit untuk bergabung jika tidak semua baris ada di semua tabel. Dengan
WHERE
kondisi yang menargetkan satu tabel, cukup mudah untuk menambahkan tabel lain denganLEFT JOIN
. Tidak sepele jika Anda memiliki predikat pada beberapa tabel ...Partisi vertikal masih dapat meningkatkan kinerja kueri tertentu. Misalnya, jika 90% kueri Anda mengambil 5 kolom yang sama dari 65 yang tersedia, ini akan lebih cepat dengan tabel hanya menahan 5 kolom ini.
OTOH, Anda mungkin dapat memenuhi permintaan tersebut pada beberapa kolom yang dipilih dengan indeks "penutup" yang memungkinkan pemindaian hanya indeks .
Kandidat lain untuk partisi vertikal: Jika Anda memiliki banyak pembaruan hanya pada beberapa kolom, sedangkan sisanya hampir tidak pernah berubah. Mungkin jauh lebih murah untuk membagi baris dalam kasus seperti itu, karena Postgres menulis versi baris baru untuk setiap pembaruan. Ada pengecualian untuk nilai besar yang disimpan di luar jalur ("TOASTed"). Keterangan lebih lanjut:
Itu benar-benar tergantung pada situasi lengkap. Jika ragu, gunakan solusi sederhana untuk memiliki satu meja, terutama jika itu menggambarkan kenyataan dengan baik: Dalam contoh Anda, itu semua adalah atribut mobil dan masuk akal bersama.
sumber
Pilih pada satu tabel harus selalu lebih cepat. Segera setelah Anda menemukan kendaraan Anda, Anda sudah memiliki semua detail.
Namun Anda kehilangan efisiensi normalisasi. Misalnya jika 1 mobil punya banyak model dengan opsi berbeda.
Apakah ini referensi db dari semua mobil? Atau daftar kendaraan bekas? Apakah akan ada banyak contoh model yang sama dengan opsi yang sama?
Sunting: saya harus memenuhi syarat jawaban saya sebagai rdbms umum daripada khusus postgres. Saya tunduk pada jawaban rinci @ Erwin khusus untuk postgres
sumber