Fokus artikel ini adalah memanfaatkan GABUNG. Kami akan memulai dengan berbicara sedikit tentang bagaimana JOIN akan terjadi dan mengapa Anda perlu JOIN data. Kemudian kita akan melihat jenis JOIN yang tersedia untuk kita dan cara menggunakannya.
DASAR-DASAR GABUNG
GABUNG dalam TSQL biasanya akan dilakukan pada baris FROM.
Sebelum kita membahas hal lain, pertanyaan besar sebenarnya adalah — “Mengapa kita harus melakukan GABUNG, dan bagaimana kita sebenarnya akan melakukan GABUNG?”
Ternyata, setiap database yang pernah kita kerjakan akan membagi datanya menjadi beberapa tabel. Ada banyak alasan berbeda untuk ini:
- Menjaga integritas data
- Menghemat ruang penyimpanan
- Mengedit data lebih cepat
- Membuat kueri lebih fleksibel
Jadi, setiap database yang akan Anda kerjakan akan membutuhkan data tersebut untuk digabungkan agar benar-benar masuk akal.
Misalnya, Anda memiliki tabel terpisah untuk pesanan dan untuk pelanggan. Pertanyaan yang menjadi — “Bagaimana kita benar-benar menghubungkan semua data bersama-sama?” Itulah tepatnya yang akan dilakukan JOIN.
CARA BEKERJA BERGABUNG
Bayangkan kasusnya, ketika kita memiliki dua tabel terpisah dan tabel tersebut akan disatukan dengan membuat jahitan.
Apa yang akan terjadi dengan jahitan, jika kita mendapatkan satu kolom dari setiap tabel yang akan digunakan untuk pencocokan, dan itu akan menentukan baris mana yang akan dikembalikan atau tidak? Misalnya, kami memiliki Pelanggan di sebelah kiri dan Pesanan Layanan di sebelah kanan. Jika kita ingin mendapatkan semua pelanggan dan pesanan mereka, kita perlu GABUNG dua tabel ini bersama-sama. Untuk ini, kita harus memilih satu kolom yang akan bertindak sebagai jahitan, dan tentu saja, kolom yang akan kita gunakan adalah ID Pelanggan.
Omong-omong, ID Pelanggan dikenal sebagai Kunci Utama untuk tabel kiri, yang secara unik mengidentifikasi setiap baris di dalam tabel Pelanggan.
Di tabel ServiceOrders, kami juga memiliki kolom ID Pelanggan, yang dikenal sebagai Kunci Asing . Kunci asing hanyalah sebuah kolom yang dirancang untuk menunjuk ke tabel lain. Dalam kasus kami, ini menunjuk kembali ke tabel Pelanggan. Oleh karena itu, begitulah cara kami menyatukan semua data itu dengan menyediakan jahitan itu.
Dalam tabel ini, kami memiliki pencocokan berikut:2 pesanan untuk 15 dan 1 pesanan untuk 23, 25, dan 26. 16 dan 22 ditinggalkan.
Satu hal penting yang perlu diperhatikan di sini adalah kita dapat BERGABUNG dengan beberapa tabel . Faktanya, sangat umum untuk MENGGABUNGKAN beberapa tabel bersama-sama, untuk mendapatkan informasi dalam bentuk apa pun. Jika Anda melihat database yang paling umum, Anda mungkin harus BERGABUNG bersama empat, lima, enam dan lebih tabel hanya untuk mendapatkan informasi yang Anda cari. Memiliki diagram database akan sangat membantu.
Untuk membantu Anda di sebagian besar lingkungan basis data, Anda akan melihat bahwa kolom yang dirancang untuk DIGABUNG memiliki nama yang sama.
JOIN SYNTAX
Revisi ketiga dari bahasa query database SQL (SQL-92) mengatur sintaks JOIN:
Dimungkinkan untuk melakukan GABUNG pada baris WHERE:
Suatu relasi biasanya memiliki interpretasi grafis sederhana dalam bentuk tabel.
Praktik dan Konvensi Terbaik
- Nama tabel alias.
- Gunakan penamaan dua bagian untuk kolom
- Tempatkan setiap GABUNG pada baris terpisah
- Menempatkan tabel dalam urutan yang logis
BERGABUNG DENGAN JENIS
SQL Server menyediakan jenis GABUNG berikut:
- GABUNG DALAM
- GABUNG LUAR
- JOIN DIRI
- GABUNG LINTAS
Untuk informasi lebih lanjut tentang topik ini, silakan baca artikel ini tentang jenis gabungan di SQL Server dan pelajari betapa mudahnya menulis kueri semacam itu dengan bantuan SQL Complete.
INNER GABUNG
Jenis JOIN pertama yang mungkin ingin kita jalankan adalah INNER JOIN. Biasanya, penulis menyebut tipe SQL Server JOIN ini sebagai JOIN biasa atau sederhana. Mereka hanya menghilangkan awalan INNER. Jenis JOIN ini menggabungkan dua tabel dan hanya mengembalikan baris dari kedua sisi yang cocok .
Kami tidak melihat Klara dan Anthony di sini karena ID Pelanggan mereka tidak cocok di kedua tabel. Saya juga ingin menyoroti fakta bahwa operasi GABUNG mengembalikan pelanggan setiap kali cocok dengan pesanan . Ada dua pesanan untuk Michael dan satu pesanan untuk Dave, Victor, dan Tom masing-masing.
Ringkasan:
- INNER JOIN mengembalikan baris hanya bila ada setidaknya satu baris di kedua tabel yang cocok dengan kondisi JOIN.
- INNER JOIN menghilangkan baris yang tidak cocok dengan baris dari tabel lain
GABUNG LUAR
JOIN luar berbeda karena mengembalikan baris dari tabel atau tampilan meskipun tidak cocok. Jenis JOIN ini berguna jika Anda perlu mengambil semua pelanggan yang belum pernah melakukan pemesanan. Atau, misalnya, jika Anda mencari produk yang belum pernah dipesan.
Cara kita melakukan OUTER JOIN adalah dengan menunjukkan KIRI atau KANAN, atau PENUH.
Tidak ada perbedaan antara klausa berikut:
- GABUNG LUAR KIRI =GABUNG KIRI
- GABUNG LUAR KANAN =GABUNG KANAN
- GABUNG LUAR LENGKAP =GABUNG LENGKAP
Namun, saya akan merekomendasikan menulis klausa lengkap karena membuat kode lebih mudah dibaca.
Menggunakan LEFT OUTER JOIN
Tidak ada perbedaan antara KIRI atau KANAN kecuali fakta bahwa kita hanya mengarahkan tabel yang ingin kita dapatkan baris tambahannya. Dalam contoh berikut, kami mencantumkan pelanggan dan pesanan mereka. Kami memanfaatkan KIRI untuk mendapatkan semua pelanggan yang belum pernah memesan. Kami meminta SQL Server untuk mendapatkan baris tambahan dari tabel kiri.
Perhatikan bahwa Karla dan Anthony belum melakukan pemesanan apa pun dan sebagai hasilnya, kami mendapatkan nilai NULL untuk ServiceName dan ServiceID. SQL Server tidak tahu apa yang harus ditempatkan di sana, dan menempatkan NULL.
Menggunakan RIGHT OUTER JOIN
Untuk mendapatkan layanan yang kurang populer dari tabel ServiceOrders, kita perlu menggunakan arah KANAN.
Kami melihat bahwa dalam kasus ini, SQL Server mengembalikan baris tambahan dari tabel kanan, dan layanan Pembersihan Karpet tidak pernah dipesan.
Menggunakan FULL OUTER JOIN
Jenis JOIN ini memungkinkan Anda untuk mendapatkan informasi yang tidak cocok dengan memasukkan baris yang tidak cocok dari kedua tabel.
Ini mungkin juga berguna jika Anda perlu melakukan pembersihan data.
Ringkasan:
GABUNG LUAR LENGKAP
- Mengembalikan baris dari kedua tabel meskipun tidak cocok dengan pernyataan GABUNG
KIRI atau KANAN
- Tidak ada perbedaan kecuali urutan tabel pada klausa FROM
- Arah menunjuk pada tabel untuk mengambil baris yang tidak cocok dari
BERGABUNG DIRI
Jenis JOIN selanjutnya yang kami miliki adalah SELF JOIN. Ini mungkin jenis JOIN yang paling tidak umum kedua yang akan Anda jalankan. SELF JOIN adalah saat Anda menggabungkan tabel ke tabel itu sendiri. Secara umum, ini adalah tanda desain yang buruk. Untuk menggunakan tabel yang sama dua kali dalam satu kueri, tabel harus diberi alias. Alias membantu pemroses kueri mengidentifikasi apakah kolom harus menyajikan data dari sisi kanan atau kiri. Selain itu, Anda perlu menghilangkan baris berbaris sendiri. Ini biasanya dilakukan dengan non-equi join.
Ringkasan:
- Menggabungkan tabel ke dirinya sendiri
- Biasanya pertanda desain dan normalisasi yang buruk
- Tabel harus diberi alias
- Perlu memfilter baris yang cocok dengan dirinya sendiri
CROSS JOIN
Jenis GABUNG ini tidak memiliki AKTIF penyataan. Setiap baris dari setiap tabel akan cocok. Ini juga dikenal sebagai Produk Cartesian (jika CROSS JOIN tidak memiliki klausa WHERE). Anda hampir tidak akan menggunakan jenis JOIN ini dalam skenario dunia nyata, namun, ini adalah cara yang baik untuk menghasilkan data pengujian.
Hasilnya adalah sebuah dataset, dimana jumlah baris pada tabel sebelah kiri dikalikan dengan jumlah baris pada tabel sebelah kanan. Akhirnya, kami melihat bahwa setiap pelanggan cocok dengan setiap layanan.
Kami mendapatkan hasil yang sama saat menggunakan klausa CROSS JOIN secara eksplisit.
Ringkasan:
- Semua baris cocok dari setiap tabel
- Tidak ada pernyataan AKTIF
- Dapat digunakan untuk menghasilkan data pengujian
GABUNG ALGORITMA
Di bagian pertama artikel, kita telah membahas logis JOIN operator yang digunakan SQL Server saat mengurai dan mengikat kueri. Mereka adalah:
- GABUNG DALAM
- GABUNG LUAR
- GABUNG LINTAS
Operator logika adalah konseptual dan berbeda dari fisik GABUNG. Jika tidak, JOIN logis tidak benar-benar bergabung kolom tabel tertentu. Sebuah JOIN logis tunggal mungkin sesuai dengan banyak JOIN fisik. SQL Server menggantikan JOIN logis menjadi JOIN fisik selama optimasi. SQL Server memiliki operator JOIN fisik berikut:
- LOOP BERSATU
- GABUNG
- HASH
Seorang pengguna tidak menulis atau menggunakan jenis GABUNG ini. Mereka adalah bagian dari mesin SQL Server dan SQL Server menggunakannya secara internal untuk mengimplementasikan JOIN logis. Saat Anda menjelajahi rencana eksekusi, Anda mungkin memperhatikan bahwa SQL Server menggantikan operator JOIN logis dengan salah satu dari tiga operator fisik.
Gabung Loop Bersarang
Mari kita mulai dari operator yang paling sederhana yaitu Nested Loop. Algoritme membandingkan setiap baris dari satu tabel (tabel luar) dengan setiap baris tabel lainnya (tabel dalam) mencari baris yang memenuhi predikat GABUNG.
Kode semu berikut menjelaskan algoritme loop gabungan bersarang dalam:
Kode semu berikut menjelaskan algoritme loop gabungan bersarang luar:
Ukuran input secara langsung mempengaruhi biaya algoritma. Input tumbuh biaya tumbuh juga. Jenis algoritma JOIN ini efisien dalam hal input kecil. SQL Server memperkirakan predikat JOIN untuk setiap baris di kedua input.
Pertimbangkan kueri berikut sebagai contoh, yang mendapatkan pelanggan dan pesanan mereka.
Operator Pemindaian Indeks Berkelompok adalah input luar dan Pencarian Indeks Terkelompok adalah input dalam . Operator Nested Loop benar-benar menemukan kecocokan. Operator mencari setiap record di input luar dan menemukan baris yang cocok di input dalam. SQL Server menjalankan operasi Pemindaian Indeks Clustered (input luar) hanya sekali untuk mendapatkan semua catatan yang relevan. Clustered Index Seek dieksekusi untuk setiap record dari input luar. Untuk mengonfirmasi hal ini, navigasikan kursor ke ikon operator dan periksa tooltip.
Mari kita bicara tentang kerumitannya. Misalkan N adalah nomor baris untuk output luar. L adalah jumlah baris total dalam SalesOrders meja. Jadi, kompleksitas kuerinya adalah O(NLogM) di mana LogM adalah kompleksitas setiap pencarian di input batin. Pengoptimal akan memilih operator ini setiap kali input luar kecil dan input dalam berisi indeks di kolom yang bertindak sebagai jahitan. Oleh karena itu, indeks dan statistik sangat penting untuk tipe GABUNG ini, jika tidak, SQL Server mungkin secara tidak sengaja berpikir bahwa tidak ada begitu banyak baris di salah satu input. Lebih baik melakukan satu pemindaian tabel daripada melakukan Pencarian Indeks 100 ribu kali. Terutama ketika ukuran input dalam lebih dari 100K.
Ringkasan:
Loop Bersarang
- Kompleksitas:O(NlogM)
- Biasanya diterapkan ketika satu meja kecil
- Tabel yang lebih besar berisi indeks yang memungkinkan pencariannya menggunakan kunci gabung
Gabung Bergabung
Beberapa pengembang tidak sepenuhnya memahami Hash dan Gabung GABUNG dan sering mengaitkannya dengan kueri berkinerja buruk.
Berbeda dengan Nested Loop yang menerima predikat JOIN, Merge Join membutuhkan setidaknya satu equi join. Selain itu, kedua input harus diurutkan pada tombol JOIN.
Kode semu untuk algoritma MERGE JOIN:
Algoritme membandingkan dua input yang diurutkan. Satu baris pada satu waktu. Jika ada persamaan antara dua baris, keluaran algoritma bergabung dengan baris dan melanjutkan. Jika tidak, algoritme membuang yang lebih kecil dari dua input dan melanjutkan. Berbeda dengan Nested Loop, biaya di sini sebanding dengan jumlah jumlah baris input. Dalam hal kompleksitas – O(N+M). Oleh karena itu, jenis JOIN ini seringkali lebih baik untuk input yang besar.
Animasi berikut menunjukkan bagaimana algoritma MERGE JOIN benar-benar menggabungkan baris tabel.
Ringkasan
- Kompleksitas:O(N+M)
- Kedua input harus diurutkan pada kunci gabung
- Operator persamaan digunakan
- Cocok untuk meja besar
Hash Gabung
Hash Join sangat cocok untuk tabel besar tanpa indeks yang dapat digunakan. Pada langkah pertama – fase pembuatan algoritme membuat indeks hash dalam memori pada input sisi kiri. Langkah kedua disebut fase pemeriksaan . Algoritme melewati input sisi kanan dan menemukan kecocokan menggunakan indeks yang dibuat selama fase pembuatan. Jika jujur, itu bukan pertanda baik ketika pengoptimal memilih jenis algoritma GABUNG ini.
Ada dua konsep penting yang mendasari jenis JOIN ini:Fungsi hash dan Tabel Hash.
Sebuah fungsi hash adalah fungsi apa pun yang dapat digunakan untuk memetakan data dengan ukuran variabel ke data dengan ukuran tetap.
tabel hash adalah struktur data yang digunakan untuk mengimplementasikan array asosiatif, struktur yang dapat memetakan kunci ke nilai. Tabel hash menggunakan fungsi hash untuk menghitung indeks ke dalam larik ember atau slot, dari mana nilai yang diinginkan dapat ditemukan.
Berdasarkan statistik yang tersedia, SQL Server memilih input terkecil sebagai input build dan menggunakannya untuk membangun tabel hash di memori. Jika tidak ada cukup memori, SQL Server menggunakan ruang disk fisik di TempDB. Setelah tabel hash dibuat, SQL Server mendapatkan data dari input probe (tabel yang lebih besar) dan membandingkannya dengan tabel hash menggunakan fungsi pencocokan hash. Akibatnya, ia mengembalikan baris yang cocok.
Jika kita melihat rencana eksekusi, elemen kanan atas adalah masukan build , dan elemen kanan bawah adalah masukan probe . Jika kedua input sangat besar, biayanya terlalu tinggi.
Untuk memperkirakan kompleksitas, asumsikan sebagai berikut:
hc – kerumitan pembuatan tabel hash
jm – kompleksitas fungsi pencocokan hash
T – meja yang lebih kecil
L – tabel lebih besar
J – penambahan kompleksitas untuk perhitungan dinamis dan pembuatan fungsi hash
Kompleksitasnya adalah:O(N*hc + M*jm + J)
Pengoptimal menggunakan statistik untuk menentukan kardinalitas nilai. Kemudian secara dinamis membuat fungsi hash yang membagi data menjadi banyak ember dengan ukuran yang sama. Seringkali sulit untuk memperkirakan kompleksitas proses pembuatan tabel hash, serta kompleksitas setiap pencocokan hash karena sifatnya yang dinamis. Rencana eksekusi bahkan mungkin menunjukkan estimasi yang salah karena pengoptimal melakukan semua operasi dinamis ini selama waktu eksekusi. Dalam beberapa kasus, rencana eksekusi mungkin menunjukkan bahwa Nested Loop lebih mahal daripada Hash Join, tetapi kenyataannya, Hash Join dieksekusi lebih lambat karena estimasi biaya yang salah.
Ringkasan
- Kompleksitas:O(N*hc +M*jm +J)
- Jenis bergabung dengan pilihan terakhir
- Menggunakan tabel hash dan fungsi pencocokan hash dinamis untuk mencocokkan baris
Produk yang berguna:
SQL Complete – tulis, percantik, perbaiki kode Anda dengan mudah, dan tingkatkan produktivitas Anda.