Pengoptimuman pangkalan data: kesan prestasi OR keadaan dalam INNER JOIN
Dalam pengoptimuman pertanyaan pangkalan data, adalah penting untuk memahami kesan keadaan berbeza dalam kenyataan JOIN. Salah satu isu biasa ialah menggunakan syarat ATAU dalam INNER JOIN.
Pertimbangkan pertanyaan berikut:
<code class="language-sql">SELECT mt.ID, mt.ParentID, ot.MasterID FROM dbo.MainTable AS mt INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID OR ot.ID = mt.ParentID</code>
Pertanyaan ini akan mengambil masa beberapa minit untuk dilaksanakan pada mulanya. Selepas pemeriksaan lebih dekat, masalah ditentukan sebagai keadaan ATAU dalam Inner JOIN.
Untuk menyelesaikan masalah ini, pertanyaan telah ditulis semula untuk menggunakan sepasang LEFT JOIN:
<code class="language-sql">SELECT mt.ID, mt.ParentID, CASE WHEN ot1.MasterID IS NOT NULL THEN ot1.MasterID ELSE ot2.MasterID END AS MasterID FROM dbo.MainTable AS mt LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL</code>
Pertanyaan yang dioptimumkan kini menyelesaikan pelaksanaan dalam kira-kira satu saat.
Menggunakan syarat ATAU dalam INNER JOIN akan menjejaskan prestasi pertanyaan dengan serius atas sebab berikut:
Oleh itu, adalah lebih baik untuk menyatakan keadaan sedemikian menggunakan set hasil bercantum. Dalam contoh di atas, ini akan diterjemahkan kepada:
<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>
Dengan menggunakan equijoins dan menggabungkan hasil, pengoptimum pertanyaan boleh melaksanakan operasi dengan cekap tanpa dikenakan penalti prestasi. Perhatikan penggunaan UNION ALL
di sini, gunakan UNION
jika anda perlu mengalih keluar baris pendua.
Atas ialah kandungan terperinci Mengapa Keadaan ATAU dalam Inner JOIN Menyebabkan Penalti Prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!