Кузнецов Евгений wrote:

Гм, все равно не понимаю.

select * from test_table3 t1 left join test_table3 t2
     on t1.ID1 is not distinct from t2.ID2

- 10/8 чтений

select * from test_table3 t1 left join test_table3 t2
     on t1.ID1 is not distinct from t2.ID2 and t2.id2 = 3

- 10/10 чтений

Разве дополнительное условие в and-связке может приводить
к увеличению числа чтений?

Может. В данном случае индекс в detail-таблице был использован для предиката t2.id2 = 3, для которого есть ровно одна запись. Отсюда 10 чтений. Это недочет оптимизатора, конечно, но ведь равенство имеет приоритет над distinct (т.к. потенциально сильнее ограничивает выборку).

Даже, если бы движок начинал анализ с условия t2.id2 = 3
(которое действительно требует 10 чтений), что ему мешает
использовать этот же индекс для t1.ID1 is not distinct from t2.ID2 ?

А вот это вопрос хороший. Надо будет покопаться. Подозреваю, что стоимость с двумя индексами оказывается выше, чем с одним.


--
Дмитрий Еманов

Ответить