Anda akan lebih baik menulis ulang kueri sebagai:
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
Meskipun ini tampaknya kurang ringkas dan perencana kueri yang baik akan melihat apa yang Anda coba lakukan dan menjalankan sub-kueri berkorelasi Anda sebagai gantinya di atas, perencana kueri yang buruk akhirnya dapat melakukan pemindaian indeks payments.id_customer
(dengan asumsi Anda memiliki indeks yang relevan ) (atau lebih buruk, pemindaian tabel) daripada melakukan hal-hal dengan cara yang lebih efisien. Bahkan perencana kueri yang baik mungkin gagal melihat optimasi jika pengaturan kueri ini dibungkus dengan sesuatu yang lebih rumit. Mengekspresikan hubungan sebagai gabungan daripada sub-kueri dapat membuat lebih banyak perbedaan daripada mengubah struktur data Anda.
Seperti yang dikatakan Jeff, setiap penonaktifan harus dipertimbangkan dengan hati-hati - ini dapat membawa peningkatan kinerja yang mudah, terutama untuk beberapa tujuan pelaporan, tetapi dapat menyebabkan ketidakkonsistenan karena bug dalam logika bisnis pendukung.
Sebagai catatan: Jelas saya tidak tahu bisnis Anda sehingga saya bisa kehilangan sesuatu, tetapi hubungan meja Anda terasa aneh bagi saya. Mereka menyiratkan bahwa Anda tidak pernah dapat memiliki lebih dari satu proyek dengan pelanggan yang sama yang biasanya tidak benar dalam pengalaman saya, setidaknya selama periode yang panjang.
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
atau jika kurang normal (meskipun saya ragu itu perlu):
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
Tentu saja itu masih mengabaikan kemungkinan proyek bersama dengan dua pelanggan ...