Ведение журнала запросов Microsoft JET SQL или “Как мне отладить программу моего клиента?”

StackOverflow https://stackoverflow.com/questions/153053

Вопрос

В чем проблема:

Мы используем программу, написанную нашим крупнейшим клиентом, для приема заказов, бронирования транспортных перевозок и выполнения других связанных с заказами действий.У нас нет другого шанса, кроме как использовать программу, а клиент категорически отказывается поддерживать нас, когда речь заходит о проблемах с его программой.Мы просто должны жить в соответствии с программой.

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

Некоторые моменты об этой программе я уже выяснил:

  • Это написано на VB 6.0
  • Он использует защищенную паролем базу данных Access-DB (Access 2000 MDB), которая находится в папке на компьютере одного пользователя.
  • Эта папка является общедоступной по сети и используется всеми другими пользователями.
  • Он использует msjet40.dll версию 4.00.9704 для взаимодействия с access.Я полагаю, это АДО?

Я также использовал Монитор процесса отслеживать доступ к файлам и выяснять, почему программа работает так медленно:он выполняет тысячи операций чтения mdb-файла, даже когда программа находится в режиме ожидания.По сети это, конечно, происходит чрезвычайно медленно:

Трассировка монитора процесса http://img217.imageshack.us/img217/1456/screenshothw5.png

Настоящий вопрос:

Есть ли какой-нибудь способ отслеживать запросы, которые отвечают за активность чтения?Есть ли флаг трассировки, который я могу установить?Подключать библиотеки DLL JET?Я предполагаю, что программа выполняет какие-то дорогостоящие запросы, которые заставляют JET считывать большое количество данных в процессе.

PS:Я уже пытался разместить mdb на файловом сервере нашей компании, но безуспешно: доступ к нему был даже медленнее, чем через локальный общий ресурс.Я также попытался изменить механизмы блокировки (оппортунистическая блокировка) на клиенте, но безуспешно.

Я хочу знать, что происходит, и мне нужны некоторые неопровержимые факты и предложения для разработчика нашего клиента, чтобы помочь ему / ей ускорить работу с программой.

Это было полезно?

Решение

Чтобы получить представление о том, что именно Access выполняет за кулисами с точки зрения запросов, существует недокументированная функция под названием JETSHOWPLAN - при включении в реестре она создает showplan.out текстовый файл.Подробности приведены в эта статья TechRepublic альтернативный, кратко изложенный здесь:

Опция ShowPlan была добавлена в Jet 3.0 и создает текстовый файл , содержащий план запроса.(ShowPlan не поддерживает подзапросы.) Вы должны включить его, добавив ключ отладки в реестр следующим образом:

\\HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\JET\4.0\Engines\Debug

В разделе новый ключ отладки добавьте строковый тип данных с именем JETSHOWPLAN (вы должны использовать все заглавные буквы).Затем добавьте ключевое значение ON чтобы включить эту функцию.Если Access был запущен в фоновом режиме, вы должны закрыть его и перезапустить, чтобы функция заработала.

Когда ShowPlan включен, Jet создает текстовый файл с именем SHOWPLAN.OUT (что может оказаться в вашем My Documents папку или текущую папку по умолчанию, в зависимости от версии Jet, которую вы используете) каждый раз, когда Jet компилирует запрос.Затем вы можете просмотреть этот текстовый файл для получения подсказок о том, как Jet выполняет ваши запросы.

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

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

Другие советы

Не могли бы вы запустить в сеть анализатор пакетов (например, Wireshark) и понаблюдать за трафиком между одним пользователем и хост-машиной?

Если он использует ODBC-соединение, вы можете включить ведение журнала для этого.

  1. Запустите ODBC Data Source Administrator.
  2. Выберите вкладку Трассировка
  3. Нажмите кнопку Начать трассировку сейчас.
  4. Выберите Применить или ОК.
  5. Запустите приложение на некоторое время.
  6. Вернитесь к администратору ODBC.
  7. Выберите вкладку Трассировка.
  8. Нажмите кнопку Остановить трассировку сейчас.
  9. Трассировку можно просмотреть в расположении, которое вы изначально указали в поле Путь к файлу журнала.

Первый вопрос:У вас есть копия MS Access 2000 или лучше?

Если это так:Когда вы говорите, что MDB "защищен паролем", вы имеете в виду, что при попытке открыть его с помощью MS Access вы получаете запрос только на ввод пароля, или он запрашивает у вас имя пользователя и пароль?(Или выдаст вам сообщение об ошибке, в котором говорится: "У вас нет необходимых разрешений для использования объекта foo.mdb".?)

Если это последнее (безопасность на уровне пользователя), найдите соответствующий файл .MDW, который поставляется вместе с MDB.Если вы его найдете, это "информационный файл рабочей группы", который используется в качестве "ключа" для открытия MDB.Попробуйте создать ярлык на рабочем столе с целью, подобной:

"Path to MSACCESS.EXE" "Path To foo.mdb" /wrkgrp "Path to foo.mdw"

Затем MS Access должна запросить у вас имя пользователя и пароль, которые (надеюсь) совпадают с тем, что запрашивает у вас приложение VB6.Это, по крайней мере, позволило бы вам открыть MDB-файл и посмотреть на структуру таблицы, чтобы увидеть, есть ли какие-либо очевидные недостатки дизайна.

Кроме того, насколько я знаю, Эдуардо прав в том, что вам в значительной степени нужно иметь возможность запускать отладчик в исходном коде разработчика, чтобы точно узнать, что делают запросы в реальном времени...

Это невозможно без помощи разработчиков.Извините.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top