Rumah > pangkalan data > tutorial mysql > Mengapa Keadaan ATAU dalam Inner JOIN Menyebabkan Penalti Prestasi?

Mengapa Keadaan ATAU dalam Inner JOIN Menyebabkan Penalti Prestasi?

Mary-Kate Olsen
Lepaskan: 2025-01-10 18:47:43
asal
968 orang telah melayarinya

Why Does an OR Condition in an INNER JOIN Cause a Performance Penalty?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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:

  • Ia menghalang pengoptimum daripada menggunakan algoritma gabungan yang lebih cekap seperti HASH JOIN atau MERGE JOIN.
  • Ia memaksa pengoptimum untuk menjana produk Cartesian, yang secara pengiraan mahal untuk meja besar.

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan