Индексы AccessРано или поздно количество записей в таблицах базы данных переходит некий уровень и пользоваться этой базой становится не комфортно: запросы выполняются медленно, формы “подвисают” и не реагируют на действия пользователя. Встает вопрос увеличения производительности. Можно пойти по пути меньшего сопротивления: добавить оперативной, поставить центральный процессор по-мощней или заменить сервер (компьютер) на более производительный. Однако такое решение не является лучшим выбором, во-первых с материальной точки зрения, а во-вторых оно не решает проблему, а лишь отодвигает сроки ее решения на некоторое время. Правильный путь — оптимизация базы данных. Первое что стоит попробовать это использование индексов.
Впервые с индексами я столкнулся на Linux-маршрутизаторе при подсчете интернет-трафика. Начитавшись в Интернет о том, что «правильные» пацаны админы строят маршрутизатор исключительно на Linux, причем для этого лучше всего подходит какой-нибудь старенький, давно не используемый Celeron, который просто подарит груде железа новую жизнь. Так и поступил: собрал Celeron 700, 256 МБ, 40 ГБ винчестер, две сетевые, из программного обеспечения: Debian, MySQL, Apache, iptables, самописный скрипт (парсит логи iptables и записывает в таблицу базы данных MySQL). Настроил и забыл. Верой и правдой прослужил этот маршрутизатор больше года, когда мне понадобилось посмотреть статистику использованного трафика за последний месяц. В phpmyadmin быстро набрал sql-запрос, нажимаю Go, сервер зашуршал винчестером и задумался минут на двадцать. По звонкам недовольных пользователей я понял, что Интернет они эти двадцать минут не получали. Надо было что-то делать.

Размер таблицы базы данных оказался просто огромный – счет шел на миллионы записей. Первое что пришло в голову это разделить одну большую таблицу на несколько маленьких, например по месяцам (секционирование). Но сначала решил попробовать добавить индекс по дате. Результат меня приятно удивил — статистика по дням выплёвывалась меньше чем за секунду. С тех пор при проектировании структуры базы данных индексам я уделяю большое внимание.

Как работают индексы?

Чтобы разобраться почему индексируемые поля повышают скорость выполнения запросов, необходимо понять как база данных производит операции выборки. Допустим есть некоторая таблица, из которой нужно получить записи, соответствующие заданному условию. Если поле, которое участвует в условии отбора, является не индексируемым, то, необходимо проверить каждую запись таблицы на выполнение условия отбора – происходит сканирование всей таблицы, а это очень медленно (особенно если таблица большая). Если поле, участвующее в условии отбора, является индексируемым, то значения этого поля уже упорядочены (по возрастанию или по убыванию), что позволяет задействовать эффективные алгоритмы поиска, не прибегая к сканированию таблицы.

Когда следует использовать индексы?

Сразу предупрежу: следует побороть в себе соблазн сделать все поля в таблице индексируемыми. Во-первых, это негативно скажется на времени вставки и обновления записей. Во-вторых, индексы нужно где-то хранить — вырастет размер файла базы данных.

Индексируемыми необходимо делать:

  • поля, используемые для формирования условий отбора (идут после слова WHERE в SQL­запросе);
  • поля, по которым осуществляется сортировка – в этом случае полезным будет указать порядок сортировки;
  • поля, которые используются для объединения таблиц в запросе.

Также, по возможности, необходимо делать индексы уникальными и не допускающие значений Null.
Определить какие индексы используются оптимизатором запросов Access можно посмотрев на план выполнения запроса.

Подведем итог: правильное использование индексов в Access приводит к увеличению скорости выполнения запросов, однако, как и всякое сильное средство, индексы в Access следует использовать с умом. Индексируемые поля являются одним из важнейших факторов повышения производительности приложений Microsoft Access.

Ну и напоследок, не могу не отметить важность качественного проектирования и монтажа кабельной сети, тем более, что на монтаж локальной сети цены доступны, что позволяет забыть об экономии на построении СКС и ЛВС.