2012-03-06 5 views
0

Я очень новичок в изучении 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 от эх таблиц

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

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

я знаю, что я не прав, но может кто-то объяснить это

**Doubt** 

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

ответ

3

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

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

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

Вы, вероятно, хотите, чтобы прочитать о б деревьев для получения дополнительной информации, например on tahiti

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

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

+0

Спасибо Рене за прекрасное объяснение, но вы можете убрать еще одно сомнение, упомянутое в вопросе, вышедшем выше, я недавно обновил, что –

0

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

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

+0

один вопрос, сканирование полной таблицы, сканирование строки с определенным значением столбца или сканирование значений столбцов всей строки независимо от того, какой фильтр мы используем, предположим, что я написал запрос select * из emp где empno = 3, здесь он сканирует определенную строку только с empno или всеми столбцами, такими как ename, зарплата, mgrid? –

+0

: Я просто хочу знать, что случилось с моей концепцией? –

+0

Я не уверен на 100%, но я бы предположил, что будет консультироваться с таблицей (-ами) индекса, которую вы фильтруете. – jsimpson

0

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

Смежные вопросы