Pengoptimuman Pertanyaan SQL: Mengelak ATAU dalam JOIN DALAM
Mengoptimumkan pertanyaan SQL yang perlahan sering mendedahkan kesesakan prestasi. Salah satu penyebab biasa ialah penggunaan OR
keadaan dalam INNER JOIN
pernyataan. Menggantikan OR
keadaan sedemikian dengan LEFT JOIN
s dan klausa WHERE
boleh meningkatkan kelajuan pertanyaan secara mendadak. Tetapi adakah menggunakan OR
dalam cantuman sentiasa menjadi masalah?
Penalti Prestasi OR dalam JOIN
JOIN
s dengan OR
keadaan kerap menghalang pengoptimuman. Ini menghalang SQL Server (atau sistem pangkalan data lain) daripada menggunakan algoritma gabungan yang sangat cekap seperti HASH JOIN dan MERGE JOIN.
Memahami Isu Prestasi
Keadaan OR
memaksa pangkalan data untuk menganggap cantuman sebagai satu siri operasi UNION
. Pertimbangkan contoh ini:
Pertanyaan yang asalnya ditulis dengan syarat OR
dalam gabungan:
(Ini adalah perwakilan yang dipermudahkan, pelan pelaksanaan sebenar boleh menjadi lebih kompleks)
Pangkalan data mungkin melaksanakannya dengan berkesan sebagai:
<code class="language-sql">SELECT * FROM maintable m JOIN othertable o ON o.parentId = m.id UNION ALL SELECT * FROM maintable m JOIN othertable o ON o.id = m.parentId</code>
Setiap operasi UNION ALL
mewakili gabungan ekui, tetapi pangkalan data mungkin gagal mengenali struktur cekap ini dalam pertanyaan berasaskan OR
asal.
Amalan Terbaik: Menggantikan ATAU dengan LEFT JOIN dan WHERE
Walaupun OR
dalam syarat penyertaan adalah betul dari segi sintaksis, ia selalunya memberi kesan teruk kepada prestasi dengan menghalang pengoptimuman pertanyaan. Pemfaktoran semula untuk menggunakan berbilang LEFT JOIN
digabungkan dengan klausa WHERE
biasanya disyorkan untuk prestasi optimum. Ini membolehkan pangkalan data menggunakan strategi penyertaannya yang paling cekap.
Atas ialah kandungan terperinci Mengapa OR Syarat dalam INNER JOINs menjadi Halangan Prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!