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