концепция доступа к индексу

Я очень новичок в Oracle, исследуя вещи, читая о доступе к индексу, я пришел к выводу, что, предположим, у меня есть таблица emp.

table emp
---------------------------
empno  ename  salary mgrid
---------------------------
1   ab  200 2
2   bn  900 3   
3   bh  900 1
4   ah  890 4   
5   kk  67  0   
6   ac  9090    

и вот как создается уникальный индекс по первичному ключу emno

    index table(suppose)
--------------------
rowid  index value  
---------------------
xyzz       1
-          2
-          3
-          4
-          5
-          6

где «-» означает некоторое шестнадцатеричное значение, предположим, я пишу запрос, который

 select * from emp where empno ='5'

затем он выберет идентификатор строки, соответствующий значению индекса 5, и извлечет строку, соответствующую 5 empno, из таблицы emp.

Теперь я сомневаюсь, что здесь он извлекается из index_table, но чтобы найти rowid, он также сканирует всю таблицу (index_table) до 5, и тот же самый rowid использует для поиска строки, тогда чем он отличается от таблицы без индекса? ,там тоже сканируем всю таблицу до 5 емпно.

единственное преимущество - индексы хранятся в порядке возрастания.

я знаю, что ошибаюсь, но может кто-нибудь объяснить это

**Doubt**

Сканирует ли полная таблица, сканирует ли каждый столбец строк независимо от состояния фильтра? давайте возьмем запрос, который я использовал выше, если в этой таблице нет первичного ключа emp, тогда он выполнит полное сканирование таблицы, затем для empno=5 он будет сканировать каждое значение empno строки или он будет сканировать empname,salary и мргид тоже?


person Gaurav Soni    schedule 06.03.2012    source источник


Ответы (3)


Oracle (или любая другая база данных) не сканирует весь индекс в опубликованном вами примере. И в этом разница между таблицей кучи и индексом.

В очень широком смысле индекс можно сравнить с телефонной книгой. Если вы хотите найти номер телефона (rowid) Фрэнка Миллера в Джорджтауне (empno=5), вы берете телефонную книгу и находите записи для Джорджтауна. Вам не нужно читать всю телефонную книгу, потому что вы знаете, что города упорядочены. Итак, вы открываете телефонную книгу посередине и обнаруживаете, что это Монтана-Сити. Поскольку Монтана-Сити идет после Джорджтауна, вы открываете телефонную книгу между текущим открытием и началом. С этой тактикой вы продолжаете, пока не найдете Джорджтаун. Затем вы делаете то же самое с фамилией и именем.

Опять же, это работает, потому что города, фамилии и имена упорядочены в алфавитном порядке. В базе данных это обеспечивается с помощью b-деревьев.

Вы, вероятно, захотите прочитать о b-деревьях для получения дополнительной информации, например, на Таити

Изменить: вы также спросили, должна ли база данных сканировать всю таблицу, если нет первичного ключа. Ответ таков: да, он должен, если также нет индекса для empno.

По аналогии с телефонной книгой это будет запрос типа найти все телефонные номера с адресом 22 Elm Street. Поскольку телефонная книга не упорядочена по названию улицы или номеру дома, вы должны прочитать каждую запись, чтобы найти соответствующие телефонные номера.

person René Nyffenegger    schedule 06.03.2012
comment
Спасибо Рене за прекрасное объяснение, но не могли бы вы развеять еще одно сомнение, упомянутое в вопросе, опубликованном выше, я недавно обновил это - person Gaurav Soni; 06.03.2012

Для индексной таблицы вы можете использовать ее не только для первичного ключа. Для любого другого столбца данные могут быть упорядочены не так хорошо, скажем, для «зарплаты» в приведенном вами примере.

В таком случае было бы полезно использовать индексную таблицу, особенно когда у вас тысячи записей.

person jsimpson    schedule 06.03.2012
comment
один вопрос, выполняет полное сканирование таблицы, сканирует строку с определенным значением столбца или сканирует значения столбцов всей строки независимо от того, какой фильтр мы используем, предположим, я написал запрос select * from emp, где empno = 3, здесь он будет сканировать конкретная строка только с empno или со всеми столбцами, такими как ename,salary,mgrid? - person Gaurav Soni; 06.03.2012
comment
Я не уверен на 100%, но я предполагаю, что это будет сверяться с индексными таблицами значений, которые вы фильтруете. - person jsimpson; 06.03.2012

«Нормальный» индекс в Oracle (и в других СУБД) представляет собой структуру B-tree. . И, черт возьми, хотя бы документацию по продукту Oracle упомянул об этом!

person Adam Musch    schedule 07.03.2012