Можете ли вы сделать
EXPLAIN PLAN FOR select * from Entries
where RefKey in (select RefKey
from Entries
where KeyStat = 1)
and RefKey = Key;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
Вы должны получить план объяснения с кучей дополнительной информации в конце.В частности, вы заинтересованы в этой операции 3. Она не только выполняет полное сканирование таблицы, но и дает только количество строк / кардинальность 1. Действительно, это означает, что она не думает, что что-то найдет (как никогдадает нулевое значение).
Вы можете сказать, что он не ожидает когда-либо найти строку, потому что хотя операция 4 говорит о 10 миллионах строк, она дает стоимость «3» и того «2».это индекс стоимости.Он не ожидает, что сканирование из '3' найдет что-либо, поэтому он никогда не ожидает вставки значения в сканирование индекса, поэтому он никогда не увидит 10M строк.
Так что я вижу две проблемы.Во-первых, он не использует индекс KeyStat.Во-вторых, он недооценивает количество строк, возвращаемых совпадением.первая может быть вызвана несоответствием типов данных.Возможно, KeyStat является символьным значением.Может быть, это не ведущий столбец в индексе.Может быть, индекс был отключен (во время задания ETL?).
Нечетная оценка также наводит на мысль.Если бы столбец был ведущим столбцом в индексе, я бы ожидал, что статистика сработает так, что max_val столбца равен 1. Если он думает, что max_val равен нулю, это объяснило бы: «Вы не найдетечто угодно ", но также и то, что у него нет индекса для быстрого поиска max_val.