Ведение журнала запросов Microsoft JET SQL или “Как мне отладить программу моего клиента?”
Вопрос
В чем проблема:
Мы используем программу, написанную нашим крупнейшим клиентом, для приема заказов, бронирования транспортных перевозок и выполнения других связанных с заказами действий.У нас нет другого шанса, кроме как использовать программу, а клиент категорически отказывается поддерживать нас, когда речь заходит о проблемах с его программой.Мы просто должны жить в соответствии с программой.
Теперь эта программа большую часть времени работает крайне медленно, когда ее используют два или более пользователя, поэтому я попытался заглянуть за кулисы и найти источник проблемы.
Некоторые моменты об этой программе я уже выяснил:
- Это написано на 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-соединение, вы можете включить ведение журнала для этого.
- Запустите ODBC Data Source Administrator.
- Выберите вкладку Трассировка
- Нажмите кнопку Начать трассировку сейчас.
- Выберите Применить или ОК.
- Запустите приложение на некоторое время.
- Вернитесь к администратору ODBC.
- Выберите вкладку Трассировка.
- Нажмите кнопку Остановить трассировку сейчас.
- Трассировку можно просмотреть в расположении, которое вы изначально указали в поле Путь к файлу журнала.
Первый вопрос:У вас есть копия 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-файл и посмотреть на структуру таблицы, чтобы увидеть, есть ли какие-либо очевидные недостатки дизайна.
Кроме того, насколько я знаю, Эдуардо прав в том, что вам в значительной степени нужно иметь возможность запускать отладчик в исходном коде разработчика, чтобы точно узнать, что делают запросы в реальном времени...
Это невозможно без помощи разработчиков.Извините.