Microsoft JET SQL Query Logging или «Как отладить программу моего клиента?» - PullRequest
3 голосов
/ 30 сентября 2008

Проблема:

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

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

Некоторые сведения о программе, которую я узнал до сих пор:

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

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

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

Реальный вопрос:

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

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

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

Ответы [ 5 ]

6 голосов
/ 23 апреля 2009

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

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

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

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

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

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

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

1 голос
/ 06 февраля 2009

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

  1. Запустите администратор источника данных ODBC.
  2. Выберите вкладку Трассировка
  3. Нажмите кнопку «Начать трассировку сейчас».
  4. Выберите Применить или OK.
  5. Запустите приложение на некоторое время.
  6. Возврат к администратору ODBC.
  7. Выберите вкладку Трассировка.
  8. Нажмите кнопку «Остановить трассировку сейчас».
  9. Трассу можно просмотреть в месте, которое вы изначально указали в поле Путь к файлу журнала.
1 голос
/ 06 февраля 2009

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

0 голосов
/ 04 октября 2008

Первый вопрос: у вас есть копия 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 и посмотреть на структуру таблицы, чтобы увидеть, есть ли какие-либо очевидные недостатки дизайна.

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

0 голосов
/ 03 октября 2008

Это невозможно без помощи разработчиков. К сожалению.

...