Microsoft JET SQL クエリログまたは「顧客のプログラムをデバッグするにはどうすればよいですか?」

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

質問

問題:

私たちは、最大の顧客が作成したプログラムを使用して、注文の受け取り、輸送の予約、その他の注文関連の作業を行っています。私たちにはこのプログラムを使用する以外に機会がありませんが、プログラムに問題がある場合、顧客は非常に非協力的です。私たちはプログラムとともに生きていかなければなりません。

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

私がこれまでに見つけたプログラムに関するいくつかの点:

  • VB6.0で書かれています
  • これは、あるユーザーのマシン上のフォルダーにある、パスワードで保護された Access-DB (Access 2000 MDB) を使用します。
  • そのフォルダーはネットワーク上で共有され、他のすべてのユーザーによって使用されます。
  • msjet40.dll バージョン 4.00.9704 を使用してアクセスと通信します。ADOだと思いますか?

私も使いました プロセスモニター ファイルアクセスを監視して、プログラムが非常に遅い理由を調べました。プログラムがアイドル状態であっても、mdb ファイルに対して何千もの読み取り操作が実行されます。ネットワーク上では、もちろんこれは非常に遅くなります。

プロセス モニター トレース http://img217.imageshack.us/img217/1456/screenshothw5.png

本当の質問:

読み取りアクティビティを担当するクエリを監視する方法はありますか?設定できるトレース フラグはありますか?JET DLL をフックしますか?プログラムが負荷の高いクエリを実行しているため、JET がプロセス内で大量のデータを読み取っているのだと思います。

追伸:すでに mdb を会社のファイル サーバーに配置しようとしましたが、ローカル共有経由よりもアクセスがさらに遅くなりました。また、クライアントのロック機構 (便宜的ロック) を変更しようとしましたが、成功しませんでした。

何が起こっているのか知りたいのですが、顧客の開発者がプロ​​グラムを高速化するために役立ついくつかの確かな事実と提案が必要です。

役に立ちましたか?

解決

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

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

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

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

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

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

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

他のヒント

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

ODBC 接続を使用する場合は、そのログ記録を有効にすることができます。

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

最初の質問: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 の意見は正しいです...

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top