Язык запросов SQL

Создание индекса



Создание индекса

Так как количество получаемых вами предложений об инвестициях и благотворительности может легко дойти до нескольких тысяч, то нужен способ, с помощью которого можно быстро выбрать интересующие вас записи. Вы сможете выполнить эту задачу самыми разными способами. Например, просмотреть все предложения, сделанные вашими братьями. Эти предложения можно эффективно выбрать, если использовать содержимое поля LastName (фамилия), как показано в следующем примере:

SELECT * FROM PowerDesign

WHERE LastName = 'Marx' ;

Впрочем, такая стратегия не работает для предложений, сделанных всеми вашими шуринами, деверями, свояками (по-английски любой из них называется одинаково — "brower-in-law". — Примеч. пер.), но эти предложения можно получить, используя другое поле, HowKnown (кто таков), как показано в следующем примере:

SELECT * FROM PowerDesign

    WHERE HowKnown = 'brother-in-law' ;

Что ж, запросы эти работают, но они, возможно, не будут работать очень быстро, если таблица PowerDesign достаточно большая (десятки тысяч записей). SQL перебирает всю таблицу построчно, отыскивая значения, которые удовлетворяют предложению WHERE. Работу можно значительно ускорить, применяя в таблице PowerDesign индексы. (Индекс — это таблица с указателями. Каждая строка в индексе указывает на соответствующую строку в таблице с данными.)

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

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

Совет 1
Совет 1

Так как поле ProposalNumber (номер предложения) одновременно и уникальное, и короткое, то с его помощью можно быстрее всего добраться к отдельной записи. Поэтому первичный ключ любой таблицы всегда должен быть индексирован. В Access это делается автоматически. Однако, чтобы использовать это поле, необходимо знать его значение в нужной вам записи. Вам могут потребоваться и дополнительные индексы, создаваемые на основе других полей, таких как LastName (фамилия), PostalCode (почтовый код) или HowKnown (кто таков). Если в таблице данных, проиндексированной по LastName, в результате поиска будет найдена первая строка, где значением этого поля является Marx, то будут найдены и все строки с таким же значением этого поля. В индексе ключи для всех этих строк идут друг за другом. Поэтому все строки, относящиеся к Chico, Groucho, Harpo, Zeppo и Karl, можно получить почти так же быстро, как и для одного только Chico.

В результате создания индекса возникает дополнительная нагрузка на вашу систему, от чего ее работа будет немного замедляться. Это замедление необходимо сравнивать с увеличением скорости доступа к записям в результате использования индекса. Если индексировать поля, часто используемые для доступа к записям из большой таблицы, то замедление работы оправдано. Однако если создавать индексы для полей, которые никогда не будут использоваться для доступа к записям, то потери времени во много раз превысят его экономию. Также не имеет смысла создавать индексы для полей, которые не позволяют отличить одну запись от другой. Например, поле BusiOrCharity (бизнес или благотворительность) просто разбивает все записи в таблице только на две категории, поэтому хороший индекс на основе этого поля создать нельзя.

Помни: Эффективность индекса в разных реализациях бывает разной. Если перенести базу данных с одной платформы на другую, то индексы, лучше всех работавшие в первой системе, могут плохо работать во второй. Случается, что база данных хуже работает с индексами, чем при их полном отсутствии. Индексы приходится заново настраивать для каждой конкретной конфигурации СУБД и аппаратного обеспечения. Какая из разных схем индексирования в общем работает лучше остальных, приходится определять опытным путем, принимая во внимание в каждом случае скорость получения данных и их обновления.

Чтобы создать индексы для таблицы PowerDesign, щелкните на пиктограмме Индексы, расположенной справа от пиктограммы Первичный ключ на панели инструментов Конструктор таблиц. Появится диалоговое окно Индексы, в котором уже есть поля Postal-Code и ProposalNumber. Диалоговое окно Индексы представлено на Рисунок 4.10.





Создание индекса

Индексы — очень важная часть любой реляционной базы данных. Они служат указателями в тех таблицах, в которых содержатся нужные данные. С помощью индекса можно прямо перейти к определенной записи, не выполняя для ее поиска последовательного, запись за записью, просмотра таблицы. Для больших таблиц индексы просто необходимы. Без индексов результат из действительно очень большой таблицы придется, возможно, ждать не секунды, а годы. (Ладно, предположим, что вам не придется ждать годами. Однако некоторые операции выборки данных, если их запустить на выполнение, могут действительно продолжаться достаточно долго. И если у вас в запасе нет ничего лучшего, что могло бы ускорить работу, то вы, вероятно, прервете операцию, не получив никаких результатов. Ведь жизнь все равно продолжается.)

Удивительно, но в спецификации SQL:2003 нет средств для создания индекса. У поставщиков СУБД должны быть собственные реализации индексов. А так как эти реализации не стандартизированы, то вполне могут отличаться друг от друга. Большинство поставщиков реализует средство создания индекса, расширяя SQL оператором CREATE INDEX (создать индекс). Но даже если в двух реализациях используются одни и те же операторы, то способы их выполнения могут быть разными. В различных реализациях используются разные варианты синтаксиса этой команды. Необходимо внимательно изучать документацию по имеющимся у вас СУБД, чтобы знать, как можно создавать индексы с помощью этих систем.



Содержание раздела