У меня есть длинный запрос, но похож на укороченный вариант здесь:Oracle выбирает неправильный индекс при соединении таблицы
select * from table_a a
left join table_b b on
b.id = a.id and
b.name = 'CONSTANT';
Есть 2 индексов на table_b
как для id
и name
, idx_id
имеет меньше дубликатов и idx_name
имеет много дубликатов. Это довольно большая таблица (20M + записи). И join
принимает 10мин +.
Простая схема объяснения показывает, как много использования памяти в части соединения, и она показывает, что она использует индекс для name
, а не id
.
Как решить эту проблему? Как заставить использовать индекс idx_id
?
Я думал о том, чтобы положить b.name='CONSTANT'
в предложение where, но это левое соединение и где будет удаляться вся запись, которая существует в table_a.
Обновленный план объяснения. Извините, вы не можете вставить весь план.
Объяснить план с b.name='CONSTANT'
:
Объясните план, комментируя b.name
пункт:
* Простой объяснить план показывает много памяти использует на джойна части, и это показывает, что он использует индекс для имени, а не id. * Итак, где план объяснения? –
@LalitKumarB добавлено – texasbruce
Ваша статистика в актуальном состоянии на обеих таблицах? – Nick