SQL ServerをクラッシュさせるSQLクエリをトレースする方法


9

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データベースです)、問題のあるクエリを見つけるためにどのようにフィルターをかけますか?

ありがとう!


1
すべてが同じサーバーで実行されていますか?つまり、Javaを使用するアプリケーションサーバーもデータベースサーバーで実行されていますか?
swasheck 2013

1
@swasheckの質問に関連して:SQL Serverの最大メモリに明示的な値セットがありますか?外部メモリの負荷を排除しましたか?
Mike Fal 2013

ブラックボックスのトレースを見てみましたか?彼らはあなたを正しい方向に向けるかもしれません。
datagod 2013

私はこれにぶつかっただけで、実行したままにしたトレースは、アプリケーションの観点からアイドルデータベースを示しています。
ジョシュア

全文検索を使用していますか?また、あなたが実行しているSQLサーバーの正確なビルドNo +エディションは何ですか?
Kin Shah

回答:


5

コマンドを使用してSQL Serverのメモリ使用量を監視する方法」DBCC MEMORYSTATUSの手順の概要に従ってください。対処方法は、調査結果によって異なります。よりアクセスしやすいMicrosoft SQL Serverのメモリボトルネック特定する方法を読むこともできます。

ただし、注意が必要なのは、個々のクエリのせいにすることはまずありません。メモリの問題を追跡することは、それよりも微妙です。リソースが不足し、クエリがメモリ不足エラーをスローする場合、エラーをスローするクエリが単に被害者ではなく被害者である可能性があることに注意してください。


ありがとう-私はそれらをすでに見ましたが、問題はサーバーが正常に動作しているように見えて突然突然動作し、メモリが徐々に不足しないことです。「このクエリを実行するには、リソースプール '内部'にシステムメモリが不足しています。実際の意味-DBCC MEMORYSTATUSの結果に関する内部リソースプールは何ですか?

これは開発サーバーですか?その場合、Hibernate 3.1にダウングレードして、問題が解消することを確認できますか?最初に2行の問い合わせがあり、そのうちの1つを排除する必要があります。SQLServerにメモリ制限が設定されていて、それを超えているか、システムの他の一部がメモリを消費していて、SQL Serverが圧迫されています。クラッシュの発生時期を中心にシステムのプロファイルを作成し、どちらが発生しているかを判別します。
epo 2013

0

Extended Eventsイベントを使用して構成に行きたいようですquery_memory_grant_xxxxx

これは、情報をログに記録し、いつでも読み取ることができるアウトサイズのSQLエンジンを保存するのに最適なオプションです(ライブデータも見ることができます)。サーバーの再起動が発生しても、保存された情報は消去されません。 DMVs

クイックセットアップ手順

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.