Описание индекса

Относится к типу индексной структуры B(balanced)-tree (сбалансированное дерево). Используются в 99% случаев, при создании первичного ключа автоматически создается именно такой обычный индекс. Для более подробной информации рекомендую поискать в интернете, т.к. информации очень много, поэтому не буду дублировать.

Когда применять

Когда процент выводимых строк таблицы очень мал, в идеале для уникальных значений. Т.е. подходит как для условия "=", так и для between, например:

--выборка по уникальному значению select * from operation where id_oper = 1000; --выборка по диапозону значений select * from operation where id_oper between 1000 and 5000;

Подготовка тестовых данных

Чтобы воспроизвести данные для теста, достаточно создать таблицу с 10 000 000 строк без первичного ключа. Как это сделать описано в предыдущей статье.

Применение индекса

  • Замерим скорость до создания индекса, на примере вывода любого id_oper:
    --включаем вывод данных для процедуры dbms_output.put_line set serveroutput on; --замеряем скорость declare v_id_oper number; v_start timestamp; v_end timestamp; v_exec_time interval day to second; begin --фиксируем время начала выполнения v_start := systimestamp; --ищем любой id_op в таблице operation select id_oper into v_id_oper from operation where id_oper = (select id_oper from operation where rownum = 1); --первый попавшийся id_oper --фиксируем время завершения выполнения v_end := systimestamp; v_exec_time := v_end - v_start; dbms_output.put_line(v_exec_time); end;
    Результат: +00 00:00:09.431000 (9 секунд) (у вас конечно же будет другое время)
  • Создадим обычный индекс для поля id_oper таблицы operation (выполняться будет пару минут):
    create index id_oper_idx on operation(id_oper);
  • Теперь снова замерим скорость скриптом из пункта 1.

    Результат: +00 00:00:00.095000 (9 сотых секунды)

Итог: было 9 секунд, стало 0.09 секунд, производительность увеличилась в ~100 раз!


Спасибо за внимание!