SQL Server 2008データベースサーバーがあります(たまたまMSフェールオーバークラスタリングで実行されていますが、ここでは関係ないと思います)。
私たちのアプリケーションはDBアクセス用にHibernateを実行しており、最近v3.1から3.6にアップグレードして以来、SQL Serverが定期的に(24〜48時間ごとに、場合によってはさらに頻繁に)クラッシュすることを経験しています。
問題の特定の問題は、メモリに関連しているようです。サーバーがクラッシュする直前に(フェイルオーバークラスターマネージャーによって自動再起動されるようです)、次のようなエラーが表示されます。
Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.
また、時々(しかし定期的に)のメッセージ
Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
エラー:17312、重大度:16、状態:1(パラメーター:)。フォーマット中にエラーが発生したため、エラーは簡略モードで出力されます。トレース、ETW、通知などはスキップされます。
次のようなアプリレベルのエラーも発生しています
java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.
そして、刺激的でおそらく有益なエラー:
The query processor ran out of internal resources and could not produce a query plan.
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions.
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.
サーバーの負荷は変更されていないため、以前にサーバーに送信されたクエリに問題があることを示していなかった場合でも、サーバーがメモリ不足になる必要はありません。
さて、質問へ-このエラーを引き起こしているクエリ(そしておそらくすべての問題)をトレースするにはどうすればよいですか?Hibernateのアップグレード以降、SQL Serverでいくつかの巨大なクエリが実行されているようですが、それは壊れています。たまたま、それらが何であるかについて私はいくつかのアイデアを持っていますが、それらを追跡できるようになれば良いでしょう。
もちろんSQL Serverプロファイラーを実行できますが、これが完了すると(そして膨大な量のデータが生成されます-これはビジーなOLTPデータベースです)、問題のあるクエリを見つけるためにどのようにフィルターをかけますか?
ありがとう!