调用DbContext.SaveChanges后,从EntityFramework Core获取数据库统计信息

时间:2017-11-16 16:34:00

标签: sql-server entity-framework

我想编写一些自动化测试来测量应用程序中特定进程中发生的数据库IO数量,并确保它们不会超过某个阈值。

在EF之外,你会:

  1. 打开SQL Server Management Studio
  2. 上设置io统计信息
  3. ...运行您的查询
  4. ...查看“消息”窗口中返回的响应,查看统计信息。
  5. 所以我想知道是否有某种方法可以将这些相同的测量值作为调用DbContext.SaveChanges的一部分。我认为您可以覆盖SaveChangesAsync和SaveChanges方法来执行“set io statistics”语句,但这样做会导致额外的数据库命中,而且在SaveChangesAsync完成后我也不知道如何获取统计信息。

    有什么想法或想法吗?

1 个答案:

答案 0 :(得分:2)

统计数据消息以Info Messages形式返回,您可以聚合。例如在EF Core中,类似于:

            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会话捕获logout事件,该事件包含结束(或从连接池重用)的每个会话的摘要统计信息。 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
相关问题