Я изучал индексы в Oracle SQL, и я хотел провести небольшой эксперимент с тестовой таблицей, чтобы увидеть, как индексы действительно работают. Как я обнаружил из более раннего сообщения, сделанного здесь, лучший способ сделать это - EXPLAIN PLAN. Однако я сталкиваюсь с чем-то, что меня смущает.
Моя примерная таблица содержит атрибуты (EmpID, Fname, Lname, Occupation и т. Д.). Я заполнил его 500 000 записей, используя написанную мной программу Java (случайные имена, профессии и т. Д.). А теперь вот несколько примеров запросов с индексами и без них:
NO INDEX:
SELECT Fname FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
EXPLAIN PLAN говорит:
OPERATION OPTIMIZER COST
TABLE ACCESS(FULL) TEST.EMPLOYEE ANALYZED 1169
Теперь я создаю индекс:
CREATE INDEX occupation_idx
ON EMPLOYEE (Occupation);
WITH INDEX "activity_idx":
SELECT Fname FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
EXPLAIN PLAN говорит:
OPERATION OPTIMIZER COST
TABLE ACCESS(FULL) TEST.EMPLOYEE ANALYZED 1169
Итак ... стоимость ВСЕ ЕЩЕ та же, 1169? Теперь я пробую следующее:
С ИНДЕКСОМ "activity_idx":
SELECT Occupation FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
EXPLAIN PLAN говорит:
OPERATION OPTIMIZER COST
INDEX(RANGE SCAN) TEST.OCCUPATION_IDX ANALYZED 67
Итак, похоже, что индекс используется только тогда, когда этот столбец является единственным, из которого я беру значения. Но я думал, что смысл индекса в том, чтобы разблокировать всю запись, используя индексированный столбец в качестве ключа? Вышеупомянутый поиск довольно бессмысленный ... он ищет значения, которые вам уже известны. Единственный стоящий запрос, который я могу придумать, который ТОЛЬКО включает значение индексированного столбца (а не остальную часть записи), - это агрегат, такой как COUNT или что-то в этом роде.
Что мне не хватает?