Доброго времени суток! On 23 фев, 10:41, Dmitry Yemanov wrote: > > Использует, но вхолостую. Нуллов же нет в таблице. Получается эквивалент > простого: on (t1.ID1 = t2.id2), который генерит те же 8 индексных чтений.
По первому запросу полностью согласен, здесь я неудачно выразился. Имелось в виду, почему второй запрос select * from test_table3 t1 left join test_table3 t2 on ((t1.ID1 = t2.id2) OR (t1.ID1 is null and t2.ID2 is null)) and (t2.id2 = 3) 10/16 чтений. Условие (t1.ID1 = t2.id2) требует 8 индексных чтений (t1.ID1 is null and t2.ID2 is null) - 0 индексных чтений из-за отсутствия NULL (t2.id2 = 3) - 10 индексных чтений Вроде бы, получается, что всего должно быть не более 10 индексных чтений, так? Причем видно, что основное затрудение - в t2.ID2 is null select * from test_table3 t1 left join test_table3 t2 on ((t1.ID1 = t2.id2) OR (t2.ID2 is null)) and (t2.id2 = 3) 10/16, а select * from test_table3 t1 left join test_table3 t2 on ((t1.ID1 = t2.id2) OR (t2.ID2+0 is null)) and (t2.id2 = 3) 10/10. Вот это и непонятно - если бы индекс для t2.ID2 is null использовался, то было бы 8 индексных чтений, если бы не использовался, то +0 не оказывал бы влияния. С уважением, Евгений