5

問題:

最大の顧客が作成したプログラムを使用して、注文の受け取り、輸送の予約、その他の注文関連の作業を行います。プログラムを使用する以外にチャンスはありません。お客様は、プログラムの問題に関して非常にサポートしていません。私たちはプログラムと一緒に暮らす必要があります。

現在、このプログラムは2人以上のユーザーで使用するとほとんどの場合非常に遅いので、カーテンの後ろを見て問題の原因を見つけようとしました。

私がこれまでに見つけたプログラムについてのいくつかのポイント:

  • それはVB6.0で書かれています
  • これは、1人のユーザーのマシン上のフォルダーにあるパスワードで保護された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を会社のファイルサーバーに配置しようとしましたが、ローカル共有よりもアクセスがさらに遅いという成功を収めました。また、クライアントのロックメカニズム(日和見ロック)を変更しようとしましたが、成功しませんでした。

私は何が起こっているのかを知りたいので、顧客の開発者がプロ​​グラムをより速くするのを助けるために、いくつかの難しい事実と提案が必要です。

4

5 に答える 5

10

Access が舞台裏でクエリ単位で行っていることを正確に把握するために、JETSHOWPLAN と呼ばれる文書化されていない機能があります。レジストリでオンにすると、showplan.outテキスト ファイルが作成されます。詳細は、 この TechRepublic の の記事にあり、ここに要約されています。

ShowPlan オプションは Jet 3.0 に追加され、クエリのプランを含むテキスト ファイルを生成します。(ShowPlan はサブクエリをサポートしていません。)次のようにレジストリに Debug キーを追加して有効にする必要があります。

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

新しい Debug キーの下に、という名前の文字列データ型を追加しますJETSHOWPLAN (すべて大文字を使用する必要があります)。次に、キー値ONを追加して機能を有効にします。Access がバックグラウンドで実行されている場合は、Access を閉じてから再起動して、機能を機能させる必要があります。

ShowPlan が有効になっている場合、Jet はクエリをコンパイルするたびに (使用している Jet のバージョンに応じて、フォルダーまたは現在の既定のフォルダーに配置SHOWPLAN.OUT される可能性があります) という名前のテキスト ファイルを作成します。My Documents次に、このテキスト ファイルを表示して、Jet がクエリを実行する方法の手がかりを得ることができます。

特に使用しない限り、キーの値を に変更して、この機能を無効にすることをお勧めしますOFF。Jet は計画を既存のファイルに追加しますが、最終的にはプロセスが実際に遅くなります。特定のクエリ プランを確認する必要がある場合にのみ、この機能を有効にしてください。データベースを開き、クエリを実行してから、機能を無効にします。

悪夢の問題を追跡するためには、これは無敵です - これは、大規模で高価な産業用データベースで得られるようなものです - この機能はクールです - 素敵でふわふわです - それは私の友人です... ;-)

于 2009-04-23T14:11:35.840 に答える
1

ODBC接続を使用している場合は、そのロギングを有効にできます。

  1. ODBCデータソースアドミニストレータを起動します。
  2. [トレース]タブを選択します
  3. [今すぐトレースを開始]ボタンを選択します。
  4. [適用]または[OK]を選択します。
  5. しばらくの間アプリを実行します。
  6. ODBCAdministratorに戻ります。
  7. [トレース]タブを選択します。
  8. [今すぐトレースを停止]ボタンを選択します。
  9. トレースは、[ログファイルのパス]ボックスで最初に指定した場所で表示できます。
于 2009-02-05T22:41:03.807 に答える
1

ネットワークにパケット スニファー (Wireshark など) を投入して、1 人のユーザーとホスト マシン間のトラフィックを監視することはできませんか?

于 2009-02-05T22:31:26.683 に答える
0

最初の質問:MS Access 2000以上のコピーはありますか?

その場合:MDBが「パスワードで保護されている」と言う場合、MS Accessを使用してMDBを開こうとすると、パスワードの入力のみを求めるプロンプトが表示されますか、それともユーザー名とパスワードの入力を求められますか?(または、「foo.mdbオブジェクトを使用するために必要な権限がありません」というエラーメッセージが表示されますか?)

後者の場合(ユーザーレベルのセキュリティ)、MDBに付随する対応する.MDWファイルを探します。見つかった場合、これはMDBを開くための「キー」として使用される「ワークグループ情報ファイル」です。次のようなターゲットでデスクトップショートカットを作成してみてください。

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

次に、MS Accessは、VB6アプリが要求するものと(うまくいけば)同じユーザー名とパスワードの入力を求めるプロンプトを表示します。これにより、少なくともMDBファイルを開き、テーブル構造を調べて、明らかな設計上の欠陥があるかどうかを確認できます。

それを超えて、私が知る限り、Eduardoは、リアルタイムクエリが何をしているのかを正確に知るために、開発者のソースコードでデバッガーを実行できる必要があるということは正しいです...

于 2008-10-03T21:35:13.363 に答える
-1

開発者の助けなしには不可能です。ごめん。

于 2008-10-03T15:24:35.997 に答える