концепция индексного доступа - PullRequest
0 голосов
/ 06 марта 2012

Я очень новичок в 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    

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

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

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

 select * from emp where empno ='5'

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

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

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

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

**Doubt**

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

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

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

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

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

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

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

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

0 голосов
/ 07 марта 2012

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

0 голосов
/ 06 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...