Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Gaurav SoniОтветов: 3

Я очень новичок в 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 и мргид тоже?

sqloracle11g

Ответы

Ответ 1 · рейтинг 3 · René Nyffenegger

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

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

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

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

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

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

Ответ 2 · jsimpson

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

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

Ответ 3 · Adam Musch

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы