Rumah > pangkalan data > tutorial mysql > Mengapa Keadaan 'OR' dalam Inner JOINs Sangat Lambat?

Mengapa Keadaan 'OR' dalam Inner JOINs Sangat Lambat?

Mary-Kate Olsen
Lepaskan: 2025-01-10 19:07:42
asal
606 orang telah melayarinya

Why Are

Analisis isu prestasi yang disebabkan oleh penggunaan "OR" di bawah syarat INNER JOIN dalam SQL Server 2008

Pertanyaan perlahan terhadap dua jadual kecil kira-kira 50,000 baris, dan pemeriksaan teliti oleh pakar pangkalan data SQL Server 2008 mendedahkan puncanya: pengendali "ATAU" dalam keadaan INNER JOIN.

Coretan kod yang bermasalah adalah seperti 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

Selepas menggantikan "ATAU" dengan sepasang LEFT JOIN, kelajuan pertanyaan dipertingkatkan dengan ketara dan boleh diselesaikan dalam masa satu saat sahaja.

Adakah "ATAU" dalam keadaan JOIN amalan buruk?

Pakar tertanya-tanya sama ada menggunakan "ATAU" dalam keadaan JOIN sentiasa tidak diingini, atau jika kes mereka hanyalah pengecualian disebabkan oleh struktur jadual tertentu.

Penjelasan teknikal

Masalah menggunakan "OR" dalam keadaan JOIN ialah ia tidak boleh dioptimumkan menjadi operasi HASH JOIN atau MERGE JOIN. Pengoptimum pertanyaan hanya boleh mewakili ini sebagai gabungan set hasil yang berbeza:

<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

Walaupun setiap set hasil individu ialah gabungan ekui, pengoptimum tidak mengenalinya sebagai gabungan ekui apabila "ATAU" hadir. Ini mengakibatkan pertanyaan yang tidak cekap.

Atas ialah kandungan terperinci Mengapa Keadaan 'OR' dalam Inner JOINs Sangat Lambat?. 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