Jet.OLEDB или ACE.OLEDB MS Access - PullRequest
       1

Jet.OLEDB или ACE.OLEDB MS Access

0 голосов
/ 22 марта 2019

Я использую Excel vba для извлечения данных из БД MS Access - это использует Excel 2013 и Access 2013 32bit.Исторически код использовал:

Provider=Microsoft.Jet.OLEDB.4.0;

Однако некоторые компьютеры были обновлены до 64-разрядной версии Excel 2016, и поставщик Jet недоступен для 64-разрядной версии.Я изменил код на:

Provider=Microsoft.ACE.OLEDB.12.0;

, который работает как для 64-битных, так и для 32-битных систем.Тем не менее, я заметил значительное снижение скорости загрузки / сохранения данных только из-за изменения этой строки.Кто-нибудь знает, почему это может быть и как я могу улучшить это?

1 Ответ

0 голосов
/ 23 марта 2019

Вы правильно выбрали поставщика ACE для битов x64.

И большим преимуществом JET было то, что он был (и остается) установлен на все копии окон по умолчанию. Поэтому нет необходимости устанавливать Access, ни среду выполнения, ни предыдущий пакет подключения к офису.

Что касается производительности? Было несколько замечаний по поводу производительности в отношении ACE x64.

Однако, один прием или предложение - убедиться, что соединение остается открытым. Другими словами, вы уверены, что обработка строк идет медленно или это общее время?

(возможно, поставьте тестовое окно сообщения или проверьте в своем коде.

Например:

 Dim T    as single

 T = timer()

 ‘ your code here

 Debug.print timer() – t

Таким образом, вышеприведенное будет выплевывать время для окна отладки (в то время как в VBA ide нажмите Ctrl-G, чтобы отобразить окно немедленной отладки.

Причина, по которой я предлагаю принудительно открыть идею, заключается в том, что часто вы обнаруживаете, что ACE открывается ОЧЕНЬ долго. Но после открытия чтение данных имеет хорошую производительность (как и раньше).

Итак, я предлагаю проверить и попробовать это исправление.

Итак, откройте стол (любой стол) и ДЕРЖИТЕ его открытым. Теперь запустите существующий код (который может хорошо открывать + закрывать другие таблицы). Проблема в том, что, когда ACE пытается открыть таблицу, он пытается установить блокировки на файл mdb / accdb, и именно этот процесс занимает ОЧЕНЬ ОЧЕНЬ много времени.

Однако, если вы заставляете (держите) открытую одну таблицу, то ОЧЕНЬ медленный процесс ACE, пытающийся заблокировать файл для чтения / записи, не происходит каждый раз, когда вы выполняете запрос или создаете дополнительные наборы записей в коде.

Итак, если скорость чтения строки высока, но время для START + открытия очень медленное, то перед тем, как запускать + тестировать свои подпрограммы, вынудите открыть таблицу для некоторого набора reocrdset (оставьте его активным и находящимся в области действия), и Затем попробуйте свой код.

Я нахожу 9 из 10 раз, это приводит к устранению этой медленной скорости, и часто я видел, что результаты не что иное, как впечатляющие (они будут работать быстрее, чем раньше !!!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...