Sebuah LEFT JOIN
benar-benar tidak lebih cepat dari INNER JOIN
. Faktanya, ini lebih lambat; menurut definisi, gabungan luar (LEFT JOIN
atau RIGHT JOIN
) harus melakukan semua pekerjaan INNER JOIN
ditambah kerja ekstra untuk memperpanjang hasil nol. Ini juga diharapkan untuk mengembalikan lebih banyak baris, yang selanjutnya meningkatkan total waktu eksekusi hanya karena ukuran kumpulan hasil yang lebih besar.
(Dan bahkan jika LEFT JOIN
adalah lebih cepat dalam spesifik situasi karena beberapa pertemuan faktor yang sulit dibayangkan, secara fungsional tidak setara dengan INNER JOIN
, jadi Anda tidak bisa begitu saja mengganti semua instance satu dengan yang lain!)
Kemungkinan besar masalah kinerja Anda terletak di tempat lain, seperti tidak memiliki kunci kandidat atau kunci asing yang diindeks dengan benar. 9 tabel cukup banyak untuk digabungkan sehingga pelambatan benar-benar bisa terjadi hampir di mana saja. Jika Anda memposting skema Anda, kami mungkin dapat memberikan detail lebih lanjut.
Sunting:
Merefleksikan lebih jauh tentang hal ini, saya dapat memikirkan satu keadaan di mana LEFT JOIN
mungkin lebih cepat daripada INNER JOIN
, dan saat itulah:
- Beberapa tabel sangat kecil (misalnya, di bawah 10 baris);
- Tabel tidak memiliki indeks yang cukup untuk menutupi kueri.
Perhatikan contoh ini:
CREATE TABLE #Test1
(
ID int NOT NULL PRIMARY KEY,
Name varchar(50) NOT NULL
)
INSERT #Test1 (ID, Name) VALUES (1, 'One')
INSERT #Test1 (ID, Name) VALUES (2, 'Two')
INSERT #Test1 (ID, Name) VALUES (3, 'Three')
INSERT #Test1 (ID, Name) VALUES (4, 'Four')
INSERT #Test1 (ID, Name) VALUES (5, 'Five')
CREATE TABLE #Test2
(
ID int NOT NULL PRIMARY KEY,
Name varchar(50) NOT NULL
)
INSERT #Test2 (ID, Name) VALUES (1, 'One')
INSERT #Test2 (ID, Name) VALUES (2, 'Two')
INSERT #Test2 (ID, Name) VALUES (3, 'Three')
INSERT #Test2 (ID, Name) VALUES (4, 'Four')
INSERT #Test2 (ID, Name) VALUES (5, 'Five')
SELECT *
FROM #Test1 t1
INNER JOIN #Test2 t2
ON t2.Name = t1.Name
SELECT *
FROM #Test1 t1
LEFT JOIN #Test2 t2
ON t2.Name = t1.Name
DROP TABLE #Test1
DROP TABLE #Test2
Jika Anda menjalankan ini dan melihat rencana eksekusi, Anda akan melihat bahwa INNER JOIN
kueri memang lebih mahal daripada LEFT JOIN
, karena memenuhi dua kriteria di atas. Itu karena SQL Server ingin melakukan pencocokan hash untuk INNER JOIN
, tetapi melakukan loop bersarang untuk LEFT JOIN
; yang pertama adalah biasanya jauh lebih cepat, tetapi karena jumlah barisnya sangat sedikit dan tidak ada indeks untuk digunakan, operasi hashing ternyata menjadi bagian kueri yang paling mahal.
Anda dapat melihat efek yang sama dengan menulis program dalam bahasa pemrograman favorit Anda untuk melakukan banyak pencarian pada daftar dengan 5 elemen, vs. tabel hash dengan 5 elemen. Karena ukurannya, versi tabel hash sebenarnya lebih lambat. Tetapi tingkatkan menjadi 50 elemen, atau 5000 elemen, dan versi daftar akan melambat menjadi crawling, karena O(N) vs. O(1) untuk hashtable.
Tetapi ubah kueri ini menjadi ID
kolom bukannya Name
dan Anda akan melihat cerita yang sangat berbeda. Dalam hal ini, ia melakukan loop bersarang untuk kedua kueri, tetapi INNER JOIN
versi dapat menggantikan salah satu pemindaian indeks berkerumun dengan pencarian - artinya ini secara harfiah akan menjadi urutan besarnya lebih cepat dengan banyak baris.
Jadi kesimpulannya kurang lebih seperti yang saya sebutkan beberapa paragraf di atas; ini hampir pasti merupakan masalah pengindeksan atau cakupan indeks, mungkin dikombinasikan dengan satu atau lebih tabel yang sangat kecil. Itulah satu-satunya keadaan di mana SQL Server mungkin terkadang memilih rencana eksekusi yang lebih buruk untuk INNER JOIN
daripada LEFT JOIN
.