Itu tergantung.. Secara umum, Oracle tidak menjamin bahwa pernyataan SQL akan menggunakan evaluasi hubung singkat (meskipun PL/SQL dijamin untuk melakukan evaluasi hubung singkat). Pengoptimal Oracle bebas mengevaluasi predikat dalam urutan apa pun yang diharapkan paling efisien. Itu mungkin berarti bahwa predikat pertama dievaluasi terlebih dahulu dan hanya baris yang cocok yang memiliki predikat kedua yang dievaluasi tetapi sangat mungkin bahwa kebalikannya terjadi atau Oracle mengubah kueri menjadi semacam UNION
dan sepenuhnya mengevaluasi kedua predikat sebelum menggabungkan hasilnya.
Karena itu, jika pengoptimal dapat menentukan pada waktu kompilasi bahwa predikat akan selalu dievaluasi ke TRUE
atau FALSE
, pengoptimal seharusnya memperlakukannya sebagai konstanta. Jadi jika, misalnya, ada batasan pada tabel yang mencegah X
dari yang pernah memiliki nilai 'true', pengoptimal tidak boleh mengevaluasi predikat kedua sama sekali (meskipun versi pengoptimal yang berbeda akan memiliki kemampuan yang berbeda untuk mendeteksi bahwa ada sesuatu yang konstan pada waktu kompilasi).
Adapun bagian kedua dari pertanyaan Anda, tanpa melihat rencana kueri, sangat sulit untuk mengatakannya. Pengoptimal Oracle cenderung cukup baik dalam mengubah kueri dari satu bentuk ke bentuk lain jika ada cara yang lebih efisien untuk mengevaluasinya. Namun secara umum, jika subQ
akan mengembalikan jumlah baris yang relatif besar dibandingkan dengan table
, mungkin lebih efisien untuk menyusun kueri sebagai EXISTS
bukan sebagai IN
.