Я очень новичок в 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 и мргид тоже?
Ответ 1 · рейтинг 3 · René Nyffenegger
Oracle (или любая другая база данных) не сканирует весь индекс в опубликованном вами примере. И в этом разница между таблицей кучи и индексом.
В очень широком смысле индекс можно сравнить с телефонной книгой. Если вы хотите найти номер телефона (rowid) Фрэнка Миллера в Джорджтауне (empno=5), вы берете телефонную книгу и находите записи для Джорджтауна. Вам не нужно читать всю телефонную книгу, потому что вы знаете, что города упорядочены. Итак, вы открываете телефонную книгу посередине и обнаруживаете, что это Монтана-Сити. Поскольку Монтана-Сити идет после Джорджтауна, вы открываете телефонную книгу между текущим открытием и началом. С этой тактикой вы продолжаете, пока не найдете Джорджтаун. Затем вы делаете то же самое с фамилией и именем.
Опять же, это работает, потому что города, фамилии и имена упорядочены в алфавитном порядке. В базе данных это обеспечивается с помощью b-деревьев.
Вы, вероятно, захотите прочитать о b-деревьях для получения дополнительной информации, например, на Таити
Изменить: вы также спросили, должна ли база данных сканировать всю таблицу, если нет первичного ключа. Ответ таков: да, он должен, если также нет индекса для empno.
По аналогии с телефонной книгой это будет запрос типа найти все телефонные номера с адресом 22 Elm Street. Поскольку телефонная книга не упорядочена по названию улицы или номеру дома, вы должны прочитать каждую запись, чтобы найти соответствующие телефонные номера.
Ответ 2 · jsimpson
Для индексной таблицы вы можете использовать ее не только для первичного ключа. Для любого другого столбца данные могут быть упорядочены не так хорошо, скажем, для "зарплаты" в приведенном вами примере.
В таком случае было бы полезно использовать индексную таблицу, особенно когда у вас тысячи записей.