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>
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>
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!