Я создал копию таблицы сотрудников в схеме HR. Затем добавил неуникальный индекс в столбец employee_id.
create table employees1 as select * from employees;
create index temp_idx on employees1(employee_id);
Затем проверил его план выполнения «выберите идентификатор сотрудника из сотрудников», он выполнил полное сканирование таблицы, и его стоимость составила 3. Однако, когда я создал уникальный индекс, он выполнил полное сканирование индекса, и стоимость была равна 1.
Насколько мне известно, способы создания уникальных и неуникальных индексов идентичны. Таким образом, количество листьев и т. Д. Должно быть одинаковым в обоих индексах. Итак, в этом случае, хотя он мог выбрать полное сканирование индекса с неуникальным индексом и снизить стоимость до 1, почему он выбрал полное сканирование таблицы и привел к худшему плану? Кстати, я не удалял и не вставлял никаких строк после создания таблицы.
all
строки, поэтому вопрос не в том, чтобы использовать индекс для быстрого доступа. В любом случае будет выполнено полное сканирование. Вопрос OP (немного ошибочный, как я объясняю в своем ответе): почему Oracle не считывает все значенияemployee_id
из индекса, который во всех случаях должен быть меньше, чем вся таблица (полные строки). - person mathguy   schedule 23.05.2020