Оптимизация Microsoft Access при использовании источников данных ODBC

Дополнительно: требуются экспертные навыки программирования, взаимодействия и многопользовательских навыков.

Эта статья относится только к базе данных Microsoft Access (.mdb или .accdb).

Аннотация

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

Дополнительная информация

Чтобы повысить производительность источников данных ODBC, воспользуйтесь следующими советами.

  • Ограничьте объем данных, запрашиваемых с сервера. Не запрашивайте больше данных, чем требуется. Используйте запросы для выбора только необходимых полей и строк.

  • Используйте только необходимые функции. Моментальные снимки менее эффективны, чем dynaset, и их невозможно обновить. Однако моментальные снимки могут выполняться быстрее, особенно для небольших наборов записей без полей Memo или ole Object.

  • Создание связанных (присоединенных) таблиц для доступа к данным сервера. Избегайте прямого доступа к серверу (то есть не открывайте удаленные базы данных и не выполняйте к ним запросы). Вместо этого создайте вложенные таблицы или сквозные запросы.

  • Проектируйте списки и поля со списком с умом. В форме для каждого списка, поля со списком, подчиненной формы и элемента управления, содержащего итог, требуется отдельный запрос. Производительность локальных данных может быть достаточной. Однако для удаленных данных при открытии формы могут возникать длительные задержки, так как каждый запрос должен быть отправлен на сервер, а перед открытием формы должен быть возвращен ответ.

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

  • Используйте команду Найти только для небольших наборов записей. Ядро СУБД Microsoft Jet оптимизирует команду Найти, чтобы хорошо работать с локальными наборами записей практически любого размера и с удаленными наборами записей разумного размера. Однако при наличии больших удаленных наборов записей (тысячи записей или более) следует вместо этого создать фильтр или запрос, а также с осторожностью использовать ограничения, которые может обрабатывать сервер.

  • Убедитесь, что запросы отправляются на сервер для обработки. Наиболее важным фактором производительности запросов к удаленным данным является обеспечение того, чтобы сервер запускал как можно больше запросов. Ядро СУБД Microsoft Jet пытается отправить весь запрос на сервер, но вычисляет локально все предложения запросов и выражения, которые обычно не поддерживаются серверами или конкретным сервером. В целом серверы не поддерживают следующие функции:

  • Операции, которые не могут быть выражены в одной инструкции SQL. Такая ситуация может возникнуть, когда вы используете запрос в качестве входных данных для другого запроса или когда предложение FROM вашего запроса содержит запрос Totals или DISTINCT. Часто запросы можно переупорядить для вычисления итогов после всех остальных операций.

    • Операции, относящиеся к ядру СУБД Microsoft Jet для SQL, такие как перекрестные запросы, запросы TOP и отчеты с несколькими уровнями группирования и итогов. Обратите внимание, что простые перекрестные запросы можно отправлять на серверы.
    • Выражения, содержащие операторы или функции, относящиеся к Microsoft Access. Финансовые функции и статистические агрегаты Microsoft Access не имеют серверных эквивалентов.
    • Определяемый пользователем Visual Basic для функций приложения, которые принимают удаленные столбцы в качестве аргументов. Эти функции не существуют на сервере, но должны обрабатывать данные удаленного столбца. Однако если определяемая пользователем функция возвращает одно значение и не ссылается на удаленный столбец, функция вычисляется локально, а ее значение отправляется на сервер для обработки.
    • Смешивание текстовых и числовых типов данных в операторах или выходных данных запроса UNION. Большинству серверов не хватает снисходит к типу данных Microsoft Access. Поэтому при необходимости используйте явные функции преобразования.
    • Разнородные соединения между локальными и удаленными таблицами или между удаленными таблицами в разных источниках данных ODBC. Соединения между небольшими локальными таблицами и большими удаленными таблицами, где индексируется столбец соединения, могут привести к удаленному соединению индекса. При удаленном соединении индекса на сервер отправляется по одному запросу для каждой строки в локальной таблице, и возвращаются только строки соединения.
    • Неудаляемые выражения или выражения, которые не могут быть отправлены удаленно, так как они не могут быть оценены сервером. Неудаляемые выходные выражения (в предложении SELECT) не выполняют локальную оценку запроса, если они не происходят в запросе Totals, запросе DISTINCT или запросе UNION. Неудалируемые выражения в других предложениях (WHERE, ORDER BY, GROUP BY, HAVING и т. д.) вынуждают по крайней мере часть запроса вычисляться локально.
  • Серверы различаются в некоторых областях поддерживаемых функций. При присоединении удаленной таблицы ядро СУБД Microsoft Jet запрашивает у драйвера ODBC его возможности. Если необходимые функции поддерживаются драйвером и сервером, ядро СУБД Microsoft Jet отправляет операцию на сервер для обработки. В противном случае ядро СУБД Microsoft Jet выполняет операцию локально. Различные области поддержки включают (но не ограничиваются ими) следующие:

    • Внешние соединения. Обратите внимание, что ядро СУБД Microsoft Jet не отправляет на сервер несколько внешних соединений, хотя множество внутренних соединений может сопровождать одно внешнее соединение.
    • Числовые, строковые функции и функции даты и времени, такие как Log(), Mid$(), DatePart() и т. д.
    • Функции преобразования, такие как CInt(), CStr(), CVDate() и т. д.