Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kinerja INNER JOIN vs LEFT JOIN di SQL Server

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara terhubung ke SQL Server dengan otentikasi windows dari Node.JS menggunakan modul mssql

  2. Tabel Pivot dan Kolom Gabungan

  3. Menghapus Akun Email Database dari Profil (SSMS)

  4. Cara Menggunakan Operator ANTARA di SQL Server

  5. Apa yang dilakukan transaksi di sekitar satu pernyataan?