Иногда при разработке приложений возникает ситуация, когда еще недавно работающая программа вдруг начинает «тормозить», запросы, ранее выполнявшиеся что называется «в полсекунды» начинают зависать и т. д. Попробуем разобраться, что может быть причиной этому и составить общие рекомендации по поводу оптимизации приложений. Как известно, в Ассеss есть мастер, позволяющий провести беглый анализ приложения. Жмем Сервис – Анализ – Быстродействие – Все типы объектов – Выделить все – ОК. Итак, что же обычно мы видим?
Приложение не сохранено в полностью откомпилированном виде.
Это означает, что нужно преобразовать базу из формата .mdb в формат .mde. Делать это нужно закрыв приложение и запустив Access. Далее находим Сервис – Служебные программы – Создать mde файл. Причем, если приложение создавалось в другой версии Access, ее сначала следует преобразовать в текущую: Сервис – Служебные программы – Преобразовать базу данных, а уже потом делать из нее .mde. В результате получится преобразованная копия базы (.mde). Начиная с версии Access 2000 поддерживается совместимость версий «снизу вверх». Это означает, что .mde файл сделанный в Access 2000 будет работать в более поздних версиях, а вот наоборот – не будет. Дело в том, что от версии к версии меняется формат .mde файла, и то, что понятно для Access 2002 – китайская грамота для Access 2000. Преобразованная таким образом база будет работать быстрее, потому, что скомпилируются все модули приложения. Но в результате Вы уже не сможете редактировать формы и отчеты в режиме конструктора. Преобразовать .mde в .mdb обратно стандартными средствами Access так же будет невозможно. Об этом следует помнить и всегда сохранять исходную (.mdb) версию базы. Стандартными нельзя, но… Как известно, нет такого замка, которого невозможно открыть. Теоретически (да и практически) можно декомпилировать базу (и не такие программы «ломали»), но это уже относится к области «хакеров», и по понятным причинам в данной статье освещаться не будет. Остановимся лишь на одном интересном для начинающих разработчиков Access вопросе. Часто программисты, ранее разрабатывавшие приложения в других средах (Си, Delphi, FoxPro и др.) спрашивают: «Как сделать в Access .exe? (исполняемый файл, способный работать сам по себе, без Access)». Ответ всегда один: никак. И причин тому несколько:
- дело в том, что изначально язык VBA разрабатывался как вспомогательное средство создания офисных документов, его определение в переводе так и звучит: «Визуальный язык программирования для приложений (офисных)», и само собой подразумевалось, что созданные с его помощью приложения будут работать только под управлением родительского приложения, в данном случае Access. Поэтому при компиляци�� в Access создается не машинный (двоичный) код, а так называемый p-код. Р-код близок к машинному, но программа в Р-коде не может быть непосредственно выполнена процессором. Преобразование (трансляция) в двоичный код происходит во время выполнения программы. Это сделано для отладки приложений. Без p-кода невозможно было бы прерывать выполнение приложений, редактировать тексты программ и снова продолжать выполнение. Кстати, аналогично ведь происходит и в других средствах разработки. Везде присутствует «промежуточная» трансляция.
- хотя Microsoft постоянно совершенствует VBA, но «отдавать» его как средство для создания независимых коммерческих приложений пока не собирается. Очевидно, что в этом случае компания может потерять значительную часть прибыли от реализации новых версий Office, ведь для того, чтобы к примеру запустить приложение Access, созданное в более новой версии Access (с новыми возможностями), необходимо установить (купить) эту новую версию. Вообще, эта тема – коммерческое распространение приложений Access заслуживает отдельной статьи, и я постараюсь в одной из следующих статей подробно остановиться на этом. Пока скажу лишь, что проблема эта вполне решаема и многие успешно реализуют свои программы.
Таблица … : свяжите с другими таблицами базы данных
Как следует из ответа мастера, в базе есть не связанная с другими таблица. В некоторых случаях это оправдано – речь идет о так называемых «служебных» таблицах, в которых заносятся какие либо параметры приложения. В этом случае ответ мастера можно проигнорировать. А вот если речь идет о справочной таблице, откуда подставляются значения (ключи) в основную таблицу, то к мастеру стоит прислушаться. Дело в том, что Access относится к самому распространенному сейчас классу реляционных СУБД, основным признаком которого является то, что данные распределены в базе, словно одежда в платяном шкафу: носки в ящике для носков, штаны в ящике штанов и т. д. Помимо этого они еще и связаны между собой логическими связями. Например: Комплект верхней одежды – это штаны + рубашка + носки. Потянув за такую «нитку» машина может вытащить весь комплект и определить его состав, а это значит, что если вы зададите ей искать головной убор (шапку) – в раздел для верхней одежды она уже не полезет, стало быть, шапка найдется быстрее. Вот это мастер и пытается нам втолковать. То есть такая «правильная» база, это как хороший шкаф у аккуратного хозяина, в котором есть отделы, в отделах секции, в секциях ячейки. В свою очередь «плохая» база – это сундук, где все свалено в одну кучу – попробуй, найди там чего. Вообще, лично я, когда хочу определить уровень разработчика Access, первым делом смотрю, как связаны у него таблицы, как распределены данные. Причем иногда оказывается, что вообще никак. Дескать, пусть сам Access разбирается, что и с чем там связано. Установка связей между таблицами делается в специальной вкладке Схема данных. Жмем сервис – схема данных или просто правой кнопкой в окне проекта и в контекстном меню выбираем схема данных. В открывшемся диалоговом окне снова жмем правой кнопкой и выбираем Добавить таблицу. В появившемся диалоговом окне раскрываем вкладку таблицы и выбираем нужные: щелкаем дважды по названиям и таблицы появляются в окне конструктора. Закрываем окно со списком таблиц. Для установки связи между таблицами нужно выбрать в одной из таблиц (главной) таблице поле для связи, нажать левую кнопку мыши и перетащить поле во вторую таблицу. Отпустить левую кнопку мыши над тем полем подчиненной таблицы, с которым устанавливается связь. После этого появится диалоговое окно Изменение связей. Здесь можно поставить автоматическую проверку ссылочной целостности – флажок обеспечение целостности данных, и если требуется, каскадное обновление/удаление связанных полей. Я практически всегда включаю флажок обеспечение целостности данных, потому, что если этого не сделать, то в скором времени Ваша база забьется «мусором» - появятся ни с чем не связанные записи.
Таблица … : добавьте индекс для поля…
Индекс - это упорядоченный список значений и ссылок на те записи, в которых хранятся эти значения. Чтобы найти нужные записи, СУБД сначала ищет требуемое значение в индексе, а затем по ссылкам быстро отбирает соответствующие записи. В каждой таблице должен быть так называемый ключ – идентификатор записи. Исключение составляют лишь специальные служебные таблицы, обычно с параметрами приложения, в которых, как правило, обычно не много записей. Чаще всего ключами делают поля типа «счетчик» - числовое поле с уникальными значениями. Но мастер просит проиндексировать еще одно поле в таблице, хотя в нем уже есть ключ-счетчик. Дело в том, что видимо в данном случае в каких либо запросах часто используется это поле, и по нему вытягиваются другие записи. Если поле проиндексировать, то поиск (выполнение запроса) пойдет быстрее. Однако индексирование может привести и к обратному эффекту. Дело в том, что при добавлении и удалении записей или при обновлении значений в индексном поле требуется обновлять индекс, что при большом количестве индексов в таблице может замедлять работу. Поэтому индексы обычно рекомендуется создавать только для тех полей таблицы, по которым наиболее часто выполняется поиск записей. Индексировать можно любые поля, кроме МЕМО-полей, полей типа Гиперссылка и объектов OLE. Итак, открываем таблицу в режиме Конструктора, выбираем поле, для которого требуется создать индекс, далее вкладка Общие и выбираем для свойства Индексированное поле значение Да (Допускаются совпадения) или Нет (Совпадение не допускаются). Индекс может быть так же и составным. Обычно такую индексацию применяют, когда нужно задать уникальные значения для группы полей. Например, в одном поле номер договора, в другом идентификатор. Нужно, что в таблице разрешалось сохранение данных типа 12П, 12Р, 12Н, а вот два раза 12П не разрешалось – сразу должно появиться сообщение о повторяющихся записях. Делается это просто: снова открываем таблицу в режиме Конструктора, на панели инструментов Конструктор таблиц жмем кнопку Индексы. В первой пустой строке поля Индекс вводим имя индекса, затем в поле Имя поля жмем на стрелку и выбираем первое поле, для которого необходимо создать индекс. В следующей строке поля Имя поля указываем второе индексируемое поле, причем для данной строки поле Индекс должно оставаться пустым. Далее повторяем это для всех полей, которые необходимо включить в индекс (разрешается включать в индекс до 10 полей).
продолжение в следующем выпуске...
|