Saya sedang menulis ulang beberapa kueri SQL yang ditulis dengan buruk dan mereka menggunakan sub-kueri secara berlebihan. Saya mencari praktik terbaik terkait penggunaan sub-kueri.
Bantuan apa pun akan dihargai.
Saya sedang menulis ulang beberapa kueri SQL yang ditulis dengan buruk dan mereka menggunakan sub-kueri secara berlebihan. Saya mencari praktik terbaik terkait penggunaan sub-kueri.
Bantuan apa pun akan dihargai.
Subkueri biasanya baik-baik saja kecuali subkueri tersebut merupakan subkueri yang bergantung (juga dikenal sebagai subkueri yang berkorelasi). Jika Anda hanya menggunakan subkueri independen dan subkueri tersebut menggunakan indeks yang sesuai, maka subkueri tersebut akan berjalan dengan cepat. Jika Anda memiliki subkueri dependen, Anda mungkin mengalami masalah kinerja karena subkueri dependen biasanya perlu dijalankan satu kali untuk setiap baris di kueri luar. Jadi jika query luar Anda memiliki 1000 baris, subquery akan dijalankan 1000 kali. Di sisi lain, subkueri independen biasanya hanya perlu dievaluasi satu kali.
Jika Anda tidak yakin apa yang dimaksud dengan subkueri yang bergantung atau independen, inilah aturan praktisnya - jika Anda dapat mengambil subkueri tersebut, menghapusnya dari konteksnya, menjalankannya, dan mendapatkan hasil yang ditetapkan, maka itu adalah independent subquery
.
Jika Anda mendapatkan kesalahan sintaksis karena merujuk ke beberapa tabel di luar subkueri, maka itu adalah dependent subquery
.
Aturan umum tentu saja mempunyai beberapa pengecualian. Misalnya:
Jika kinerja menjadi masalah, ukur kueri spesifik Anda dan lihat mana yang terbaik bagi Anda.
Tidak ada solusi terbaik di sini. Setiap penggunaan harus dinilai secara independen. Ada beberapa kasus di mana subkueri yang berkorelasi jelas tidak efisien, yang di bawah ini lebih baik ditulis sebagai GABUNG
select nickname, (select top 1 votedate from votes where user_id=u.id order by 1 desc)
from users u
Di sisi lain, kueri EXISTS dan NOT EXISTS akan menang atas JOIN.
select ...
where NOT EXISTS (.....)
Biasanya lebih cepat dari
select ...
FROM A LEFT JOIN B
where B.ID is null
Namun generalisasi ini pun bisa saja tidak benar untuk skema dan distribusi data tertentu.
Sayangnya jawabannya sangat tergantung pada sql server yang Anda gunakan. Secara teori, gabungan lebih baik dari sudut pandang teori relasional murni. Mereka membiarkan server melakukan hal yang benar dan memberi mereka kontrol lebih besar sehingga pada akhirnya bisa lebih cepat. Jika server diimplementasikan dengan baik. Dalam praktiknya, beberapa server SQL berkinerja lebih baik jika Anda mengelabuinya agar mengoptimalkan kuerinya melalui sub-kueri dan sejenisnya.