オラクル10Gに支えられた新旧両方の多くのアプリで構成される大企業があります。ブロッキングセッションまたはデッドロックが発生し、トレースレポートを取得する場合、SQLに詳細を埋め込んで、どのアプリ、具体的にはどこから実行されたかを知ることができると非常に便利です。解決時間を短縮するだけでなく、ビジネスプロセスが相互に踏み込んでいる場所を見つけるのにも役立ちます。これをどのように達成できるかについてはいくつか考えていますが、これがすでに解決された問題であるかどうかは興味があります。成功した(またはその他の)試みについての考えや詳細をいただければ幸いです。
5 に答える
Oracle DBMS_APPLICATION_INFOパッケージを介して、実行中の SQL のチャンクにタグを付けることができます。これは、どのアプリケーション言語でも機能し、データベース エンジン自体の中で機能し、SQL ステートメントをコメントで乱雑にすることはありません (いずれにせよ、スマート コメントは悪です)。さらに重要なことは、Oracle のさまざまなツールがデータを認識し、トラブルシューティングやチューニングの際に使用できるようにすることです。
SQL ステートメントを動的に変更して、それらを実行したコマンドがクエリの最初のコメントに含まれるようにします。これは、私たちが独自のトランザクション管理を行い、厳格なフレームワークを持っているためです。しかし、基本コードは単純です (Java で... 他の言語がこれをどのように処理するかはわかりません):
String sql = "SELECT * FROM USERS WHERE ID = ?";
Connection con = getConnection();
PreparedStatement ps = con.prepareStatement(getComment() + sql);
// etc
String getComment() {
return " /* " + getCommandName() + " */ ";
}
JDBC ドライバーはコメントをそのまま渡し、DBA がクエリを調べているときにデータベースに表示されます。私たちのコマンド アーキテクチャは、この目的のためにコマンド名のスレッド ローカル スタックを維持します。また、接続ファクトリは JDBC 接続を独自の接続オブジェクトでラップするため、通常使用する使いやすいヘルパー メソッドを使用する代わりに、ベアメタル接続インスタンスに対してプログラムを作成した場合でもこのコードが存在します。
Properties jdbcProperties = new Properties();
this.jdbcProperties.put("user", userName);
this.jdbcProperties.put("password", password);
this.jdbcProperties.put("v$session.program", "YourApplicationName");
DriverManager.getConnection(url, jdbcProperties);
次に、接続のプログラム列に対してグループ化して v$session を確認します。簡単です..
tkprof (10.2.0.4) を通じてタグ付けされるように、SQL ステートメントにコメントを埋め込みたいと思いました。スラッシュとアスタリスクまたは二重ハイフンのコメントは、ある時点で削除されているようです。次に、偽のSQLヒントの構文を使用しましたが、これはtkprofを介して持続しました。
/*+ testrun=4A */
データベースはそれを無視し、私のニーズに応えます。
「どのアプリと、具体的にはどこから実行されたかの両方を知っています」アプリケーションがどのように記述されているかについては言及していません.11gは、SQLがPLSQLプログラムから発行されたときに追加情報を取得します。環境、潜在的な DB アップグレード時間枠、およびコード変更に伴う労力。同じ SQL が複数のアプリケーションから発行された場合、(ほとんどの場合) v$sql には 1 つのエントリしかないため、1 つのアプリまでたどることができない場合があります。