Главная » SQL, Базы данных » Способы использования индексов

0

Фундаментальным преимуществом любого  индекса  по  сравнению  с  другими  путями  доступа является  то,  что  он  ускоряет  поиск.  Но  применение  индексов  связано  также  с  определенным недостатком — они замедляют операции обновления. Например, после вставки  каждой новой записи в индексированный  файл  необходимо  также  вводить  новый  элемент  в  индекс.  В  качестве  более конкретного  примера  достаточно  представить  себе,  какие  действия  СУБД  должны  выполнить  над индексом CITY, показанным на рис. Г.9, если  поставщик S2 переезжает, скажем, из Парижа в Лондон. Поэтому,  вообще  говоря,  рассматривая  возможность  использования  некоторого  поля  в  качестве кандидата  для  индексации,  необходимо  прежде  всего  найти  ответ  на  такой  вопрос:  "Что  важнее, эффективная выборка на основе значений рассматриваемого иоля или издержки обновления, связанные с обеспечением такой эффективной выборки?".

В оставшейся части этого раздела речь пойдет именно об операциях выборки.

По сути, индексы могут использоваться двумя различными способами. Во-первых, с их  помощью может  осуществляться  последовательный  доступ  к  индексированному  файлу  (здесь   под  термином "последовательный"  подразумевается  "в  последовательности,  определяемой  значениями  индексированного поля"). Например, индекс CITY, показанный на рис. Г.9,  позволяет обращаться к  записям файла  поставщиков  в  алфавитной  последовательности  названий  городов.  Во-вторых,  индексы  могут использоваться для прямого доступа к  отдельным  записям в  индексированном  файле с  учетом конкретного значения  индексированного поля. Этот второй случай можно проиллюстрировать на примере запроса: "Определить поставщиков из Лондона", который рассматривался в начале данного раздела.

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

■       Последовательный доступ. Индекс позволяет также упростить выполнение запросов с примене нием диапазона значений, например: "Определить поставщиков из городов, названия которых начинаются  с  букв,  принадлежащих  к указанному диапазону  в  алфавитном  порядке" (допустим, начинаются с одной из букв в диапазоне L—R). При этом следует учитывать также два важных частных случая: а) "Определить всех поставщиков из городов, названия которых в алфавитном порядке предшествуют некоторому указанному значению (или следуют за этим значением)", и б) "Определить всех поставщиков из города, название которого находится на первом (или на последнем месте) в алфавитном порядке".

■       Прямой доступ. Индекс позволяет также упростить выполнение запросов с применением списка,

например: "Определить поставщиков из городов, названия которых указаны в некотором

‘   заданном списке" (допустим, Лондон, Париж и Нью-Йорк).

Кроме того, имеются некоторые запросы, например, с проверкой наличия данных (на которые можно получить ответ исключительно из индекса, вообще без какого-либо обращения к индексированному файлу. Предположим, что нужно найти ответ на запрос: "Имеются ли какие-либо поставщики в Афинах?". Ответ на этот запрос, безусловно, будет положительным тогда и только тогда, когда в индексе CITY имеется элемент, относящийся к Афинам. Аналогичные замечания относятся и к запросам, в которых используются определенные агрегирующие операторы. В качестве примера можно указать запрос: "Определить первый город в алфавитном порядке, где имеются поставщики"; в данном случае  может применяться агрегирующий оператор MIN (напомним, что такая возможность рассматривалась в главе 18).

Каждый конкретный  файл может иметь любое количество индексов. Например, для  файла поставщиков можно задать и индекс CITY, и индекс STATUS (рис. Г. 10). После этого указанные индексы могут использоваться для обеспечения эффективного доступа к записям  поставщиков на основе заданных значений либо CITY, либо STATUS, либо обоих значений. В качестве иллюстрации такого случая, в котором применяются оба значения, рассмотрим запрос: "Определить поставщиков из Парижа со статусом 30". Индекс CITY позволяет определить идентификаторы записей (скажем, г2 и гЗ) для поставщиков из Парижа; аналогичным образом, индекс STATUS указывает на идентификаторы записей (скажем, гЗ и г5) для поставщиков со статусом 30. Сравнение этих двух множеств идентификаторов записей явно показывает, что  единственным поставщиком, который соответствует первоначальному запросу, является поставщик с идентификатором записи, равным гЗ (а именно поставщик S3). В самой СУБД доступ к файлу поставщиков можно выполнить только после проверки индексов, чтобы сразу же получить желаемую запись.

рис. Г.10. Индексация файла поставщиков по двум полям, CITY и STATUS

Дополнительная терминология. Индексы иногда называют инвертированными списками (inverted list) по следующей причине. Прежде всего, "обычный" файл (в этом смысле как типичный пример обычного файла может рассматриваться файл поставщиков, показанный на рис. Г.9 и  Г.10), вообще говоря, содержит для каждой записи список значений полей данной записи. В отличие от этого, индекс для каждого значения индексированного поля содержит список записей, имеющих это значение. (Системы

баз данных с инвертированными списками, которые  были кратко  упомянуты в разделе 1.6  главы 1, получили свое название от указанного термина.) Приведем еще один важный термин — файл, в котором индекс имеется на каждом поле, иногда называют полностью инвертированным (fully inverted).

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии