
Я создал приложение календарного типа на MS Access 2013 с SQL Server в качестве бэкэнда (каждый день в календаре — это подчиненная форма). Около 20 таблиц подключены с помощью линии Call AttachDSNLessTable([details here])
. На месте скорость просто отличная, но когда я пытаюсь получить к нему доступ через VPN, требуется около 6 минут, чтобы просто загрузить домашний экран. А все остальное занимает как минимум в 5 раз больше времени.
Я не знаю альтернативных вариантов. Возможно ли сделать базу данных доступной через Интернет? Это хоть немного ускорит работу? Или нам следует увеличить пропускную способность VPN? Какой вариант мне лучше выбрать? Спасибо.
решение1
Ваша общая архитектура приложения (Access with Linked Tables) вероятно несовершенна для этой цели. Это, вероятно, можно исправить (в основном), но не без некоторой доработки.
Ключевая проблема в том, что когда Access является фронтендом, Access сам определяет, может ли он отправить весь запрос на обработку SQLServer, и часто приходит к выводу, что не может, поэтому он часто выполняет запрос сам, загружая всю таблицу. Это особенно верно для соединений, особенно если нет сильного первичного ключа для каждой из используемых таблиц.
Вот документ MS Technet по производительности связанных таблиц Access с бэкэндом SQLServer:https://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx
Наиболее существенная часть:
Основная причина снижения производительности запроса заключается в том, что запрос, включающий очень большие таблицы, требует загрузки всех данных из одной или нескольких таблиц на клиент. Это может произойти даже тогда, когда соединения или критерии, по-видимому, ограничивают набор результатов небольшим количеством записей. Это происходит потому, что иногда ядро базы данных Office Access определяет, что не может отправить весь запрос на SQL Server. Вместо этого оно отправляет несколько запросов, часто включая запросы, которые запрашивают все строки в таблице, а затем объединяет или фильтрует данные на клиенте. Если критерии требуют локальной обработки, даже запросы, которые должны возвращать только выбранные строки из одной таблицы, могут потребовать возврата всех строк в таблице.
- Использование диагностических утилит JET/ODBC для определения того, где выполняется вся работа.
- Использование Snapshot RecordSets в доступе там, где это возможно.
- Передача логики запросов на SQLServer с помощью представлений и хранимых процедур/функций.
- Создайте надежные ключи и индексы в SQLServer и убедитесь, что индексы дефрагментированы по мере необходимости.
- Кэширование часто используемых данных в Access.
По ссылке выше есть много отличных советов и технических подробностей для кого-то в вашем положении. Удачи!