先日、一時テーブルとテーブル変数のパフォーマンスについて調査をしていた際に、次の情報が見つかりました。
この中で Visual Studio の パフォーマンス プロファイラー (Performance Profiler) を使用してスタックトレース (コールスタック) を取得した内容について紹介がされていました。
最近、SQL Server のスタックトレース確認をすることが多く、次の方法を使用して確認を行っていました。
- 拡張イベントの callstack フィールド
- WinDbg
- xperf + WPA
- PerfView
Visual Studio からの確認であればクエリを実行しながらスタックトレースを確認することができて便利そうなので、試してみました。
今回は Visual Studio を起動している環境上で起動している SQL Server を移用しています。
パフォーマンスプロファイラーは「デバッグ」または、「Alt+F2」から起動することができます。
ターゲットとして、SQL Server プロセスを選択し「CPU 使用率」の情報を取得するようにすることで SQL Server のスタックトレースを取得することができます。
スタックトレースの解決には、シンボルファイルの設定が必要となりますので、基本的な使用方法については次の情報を参照してください。
- プロファイラー設定の最適化
- プロファイリング ツールの最初の確認 (C#、Visual Basic、C++、F#)
- パフォーマンス プロファイラーで CPU 使用量をデバッグなしで分析する (C#、Visual Basic、C++、F#)
「開始」後に、SQL Server の操作をし、トレースを取得したい操作が完了したら「収集の停止」をクリックすることで情報を取得することができます。
デフォルトの設定では、取得後の情報は次のようになっていて、確認をしたい SQL Srever の情報については「ネイティブ」となっており、詳細を確認することができません。
これについては、Visual Studio 2019 16.5.4 C++/CLR Performance profiler does not show functions, only shows categories [Native], [External Code] and [Unwalkable] で解説が行われています。
「フィルター」の「ネイティブ コードを非表示にする」を無効にすることで、詳細な情報を確認することができるようになります。
今回、一時テーブルの作成についての調査を行っており SQL Server 2019 を使用した場合の挙動も確認していたのですが、一時テーブル作成時の情報としては次のような情報を確認できました。
SQL Server 2019 では、メモリ最適化 tempdb メタデータという機能があるのですが、一時テーブルの作成時に、メモリ最適化テーブル (Hekaton) の関数の呼び出しになっていることがこの情報から確認できます。
スレッド単位の動作や特定のイベントが発生した場合のスタックトレースの確認については、XPerf / 拡張イベントを使用したほうが情報の確認がしやすいですが、カジュアルに確認したい場合には、Visual Studio を使用すると便利そうですね。
[…] https://blog.engineer-memo.com/2022/11/14/visual-studio-%e3%83%91%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9… […]
【後で読みたい!】Visual Studio パフォーマンス プロファイラーを使用した SQL Server のスタックトレースの確認 | Tak's Bar
14 11月 22 at 18:43