2017-11-16 17 views
0

アプリケーションの特定のプロセスで発生しているデータベースIOの量を測定し、決して特定のしきい値を超えないように自動テストを記述したいと思います。 EFのDbContext.SaveChangesを呼び出した後にEntityFrameworkコアからデータベース統計を取得する

外で、あなたはでしょう:

  • に関する統計IO

    1. SQL Server Management Studioを開き
    2. セット...に返された応答を見て...あなたのクエリ
    3. を実行しますMessagesウィンドウに統計が表示されます。

    DbContext.SaveChangesの呼び出しの一部としてこれらの同じ測定値を取得する方法があるのだろうかと思います。私はSaveChangesAsyncとSaveChangesメソッドをオーバーライドして "set io statistics"ステートメントを実行することができると思いますが、そのようにすると余分なデータベースがヒットし、SaveChangesAsyncの完了後に統計を戻す方法もわかりません。

    ご意見やご提案はありますか?

  • 答えて

    1

    統計情報メッセージは、集計できる情報メッセージとして戻ってきます。たとえば、EFコアのようなもの:

      db.Database.OpenConnection(); 
          var con = db.Database.GetDbConnection() as SqlConnection; 
          db.Database.ExecuteSqlCommand("set statistics io on"); 
          con.InfoMessage += (s, a) => 
          { 
           if (a.Errors[0].Number == 3615) 
           { 
            Console.WriteLine(a.Message); 
           } 
          }; 
    

    もっと良い方法はおそらくサーバーで監視することです。 XEventsセッションを使用してログアウトイベントを取得できます。ログアウトイベントは、終了する(または接続プールから再利用される)各セッションの要約統計情報を保持します。 EG

    CREATE EVENT SESSION [Session Stats] ON SERVER 
    ADD EVENT sqlserver.logout(
        ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.username)) 
    WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) 
    GO 
    
    関連する問題