Pertama-tama, raison d'etre (alasan keberadaan) database relasional adalah untuk dapat memodelkan hubungan antar entitas. Gabungan hanyalah mekanisme yang digunakan untuk melintasi hubungan tersebut. Mereka pasti datang dengan biaya nominal, tetapi tanpa gabungan, sebenarnya tidak ada alasan untuk memiliki database relasional.
Dalam dunia akademis kita mempelajari hal-hal seperti berbagai bentuk normal (1, 2, 3, Boyce-Codd, dll.), Dan kita belajar tentang berbagai jenis kunci (primer, asing, alternatif, unik, dll.) Dan caranya hal-hal ini cocok untuk merancang database. Dan kami mempelajari dasar-dasar SQL serta memanipulasi baik struktur maupun data (DDL & DML).
Di dunia korporat, banyak konstruksi akademis ternyata secara substansial kurang layak daripada yang selama ini kita yakini. Contoh sempurna adalah gagasan tentang kunci utama. Secara akademis, atribut (atau kumpulan atribut) itulah yang secara unik mengidentifikasi satu baris dalam tabel. Jadi di banyak domain masalah, kunci utama akademik yang tepat adalah gabungan dari 3 atau 4 atribut. Namun, hampir semua orang di dunia korporat modern menggunakan bilangan bulat berurutan yang dihasilkan otomatis sebagai kunci utama tabel. Mengapa? Dua alasan. Yang pertama adalah karena membuat model jauh lebih bersih saat Anda memigrasi FK di semua tempat. Yang kedua, dan paling erat dengan pertanyaan ini, adalah bahwa mengambil data melalui gabungan lebih cepat dan lebih efisien pada satu bilangan bulat daripada pada 4 kolom varchar (seperti yang telah disebutkan oleh beberapa orang).
Mari kita gali lebih dalam sekarang menjadi dua subtipe spesifik dari database dunia nyata. Jenis pertama adalah database transaksional. Ini adalah dasar bagi banyak e-niaga atau aplikasi manajemen konten yang menggerakkan situs modern. Dengan DB transaksi, Anda sangat mengoptimalkan "throughput transaksi". Sebagian besar aplikasi perdagangan atau konten harus menyeimbangkan kinerja kueri (dari tabel tertentu) dengan kinerja penyisipan (di tabel lain), meskipun setiap aplikasi akan memiliki masalah unik yang didorong oleh bisnis untuk dipecahkan.
Jenis kedua dari database dunia nyata adalah database pelaporan. Ini digunakan hampir secara eksklusif untuk menggabungkan data bisnis dan untuk menghasilkan laporan bisnis yang bermakna. Mereka biasanya dibentuk berbeda dari database transaksi tempat data dibuat dan mereka sangat dioptimalkan untuk kecepatan pemuatan data massal (ETL) dan kinerja kueri dengan kumpulan data yang besar atau kompleks.
Dalam setiap kasus, pengembang atau DBA perlu menyeimbangkan fungsionalitas dan kurva kinerja dengan hati-hati, dan ada banyak trik peningkatan kinerja di kedua sisi persamaan. Di Oracle, Anda dapat melakukan apa yang disebut "menjelaskan rencana" sehingga Anda dapat melihat secara spesifik bagaimana kueri diurai dan dijalankan. Anda ingin memaksimalkan penggunaan indeks yang tepat dari DB. Satu benar-benar tidak-tidak buruk adalah menempatkan fungsi di klausa where dari kueri. Setiap kali Anda melakukannya, Anda menjamin bahwa Oracle tidak akan menggunakan indeks apa pun pada kolom tersebut dan kemungkinan besar Anda akan melihat pemindaian tabel penuh atau sebagian dalam paket penjelasan. Itu hanyalah satu contoh spesifik tentang bagaimana kueri dapat ditulis yang akhirnya menjadi lambat, dan tidak ada hubungannya dengan gabungan.
Dan saat kita berbicara tentang pemindaian tabel, mereka jelas memengaruhi kecepatan kueri secara proporsional dengan ukuran tabel. Pemindaian tabel lengkap dari 100 baris bahkan tidak terlihat. Jalankan kueri yang sama pada tabel dengan 100 juta baris, dan Anda harus kembali minggu depan untuk mengembalikannya.
Mari kita bicara tentang normalisasi sebentar. Ini adalah topik akademis positif lainnya yang bisa membuat Anda stres. Sebagian besar waktu ketika kita berbicara tentang normalisasi yang kita maksud adalah penghapusan data duplikat dengan memasukkannya ke dalam tabelnya sendiri dan memigrasi FK. Orang biasanya melewatkan seluruh hal ketergantungan yang dijelaskan oleh 2NF dan 3NF. Namun dalam kasus ekstrim, tentu saja mungkin untuk memiliki basis data BCNF sempurna yang sangat besar dan lengkap untuk menulis kode karena itu sangat dinormalisasi.
Jadi di mana kita menyeimbangkan? Tidak ada satu pun jawaban terbaik. Semua jawaban yang lebih baik cenderung berupa kompromi antara kemudahan pemeliharaan struktur, kemudahan pemeliharaan data, dan kemudahan pembuatan / pemeliharaan kode. Secara umum, semakin sedikit duplikasi data, semakin baik.
Jadi mengapa penggabungan terkadang lambat? Terkadang itu desain relasional yang buruk. Terkadang pengindeksan tidak efektif. Terkadang ini masalah volume data. Terkadang itu adalah pertanyaan yang ditulis dengan sangat buruk.
Maaf untuk jawaban yang bertele-tele seperti itu, tetapi saya merasa terdorong untuk memberikan konteks yang lebih kecil di sekitar komentar saya daripada hanya memberikan tanggapan 4-peluru.