Доброго времени суток!

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 не
оказывал бы влияния.

С уважением, Евгений

Ответить