Glimpse HUD和SQL选项卡中数据库查询计数之间的差异

EF0*_*EF0 4 asp.net-mvc-3 glimpse

这个问题涉及Glimpse.MVC3和Glimpse.EF5包.我正在尝试在旧的MVC3站点上调试性能问题.根据Glimpse的HUD,一个特定的GET请求共有12个查询,总共28ms - 但是当我展开以打开主面板,然后单击SQL选项卡时,它说只有6个查询,总共10.41ms.顶部的计数都是6,当我计算它列出的查询时,有6个.当我看到编写的代码时,这也是有意义的.(无论哪种方式,我都可以看到太多是懒惰加载,它需要修复.)

没有来自Glimpse的指标,相同的6个查询正在被执行两次(当我看到HUD显示的面板数量是面板的两倍时,这就是我的大脑所在的位置).

此外,HUD显示0个 Ajax请求,但历史部分实际显示1(这绝对是准确的).

有什么想法会出现差异吗?(请记住,我更关心与查询的差异.)



编辑 - 请求的文件中的JSON:

glimpse_sql:
{
  data:
  {
    "SQL Statistics":
    [
      {
        connectionCount: 6
        queryCount: 6
        transactionCount: 0
        queryExecutionTime: 6.91
        connectionOpenTime: 116.08
      }
    ]
    Queries:
    [
      [
        Commands per Connection
        Duration
      ]

hud:
  {
    sql:
    {
      data:
      {
        queryCount: 12
        connectionCount: 12
        transactionCount: 0
        queryExecutionTime: 41.87
        connectionOpenTime: 242.96
      }
      name: sql
    }
Run Code Online (Sandbox Code Playgroud)

编辑2 - 查询

"Queries":[["Commands per Connection","Duration"],

[[["Transaction Start","Ordinal","Command","Parameters","Records","Duration","Offset","Async","Transaction End","Errors"],[null,"1","SELECT TOP (2) \r\n[Extent1].[TrxnID] AS [TrxnID], \r\n[Extent1].[StartTime] AS [StartTime], \r\n[Extent1].[Lane] AS [Lane], \r\n[Extent1].[EmployeeID] AS [EmployeeID], \r\n[Extent1].[OptionsCompleted] AS [OptionsCompleted], \r\n[Extent1].[StoreID] AS [StoreID], \r\n[Extent1].[NoVehicleTireCheck] AS [NoVehicleTireCheck], \r\nFROM [Activity].[Trxn] AS [Extent1]\r\nWHERE [Extent1].[TrxnID] = 353 /* @p__linq__0 */",[["Name","Value","Type","Size"],["@p__linq__0",353,"Int32",0]],1,1.12,76.67,false,null,null,""]],5.85],

[[["Transaction Start","Ordinal","Command","Parameters","Records","Duration","Offset","Async","Transaction End","Errors"],[null,"1","SELECT \r\n[Extent1].[TrxnID] AS [TrxnID], \r\n[Extent1].[CustomerID] AS [CustomerID], \r\n[Extent1].[FirstName] AS [FirstName], \r\n[Extent1].[LastName] AS [LastName], \r\n[Extent1].[RewardAccountID] AS [RewardAccountID], \r\n[Extent1].[CustomerEmail] AS [CustomerEmail], \r\n[Extent1].[HomePhone] AS [HomePhone]\r\nFROM [Activity].[Trxn_Customers] AS [Extent1]\r\nWHERE [Extent1].[TrxnID] = 353 /* @EntityKeyValue1 */",[["Name","Value","Type","Size"],["@EntityKeyValue1",353,"Int32",0]],0,1.18,102.7,false,null,null,""]],21.7],

[[["Transaction Start","Ordinal","Command","Parameters","Records","Duration","Offset","Async","Transaction End","Errors"],[null,"1","SELECT \r\n[Extent1].[TrxnID] AS [TrxnID], \r\n[Extent1].[VehicleID] AS [VehicleID], \r\n[Extent1].[VehicleVIN] AS [VehicleVIN], \r\n[Extent1].[VehicleOdometer] AS [VehicleOdometer], \r\n[Extent1].[VehicleEngineID] AS [VehicleEngineID], \r\n[Extent1].[VehicleMakeID] AS [VehicleMakeID], \r\n[Extent1].[ModelYear] AS [ModelYear]\r\nFROM [Activity].[Trxn_Vehicles] AS [Extent1]\r\nWHERE [Extent1].[TrxnID] = 353 /* @EntityKeyValue1 */",[["Name","Value","Type","Size"],["@EntityKeyValue1",353,"Int32",0]],0,1.26,2301.56,false,null,null,""]],27.72],

[[["Transaction Start","Ordinal","Command","Parameters","Records","Duration","Offset","Async","Transaction End","Errors"],[null,"1","SELECT \r\n[Extent1].[TrxnID] AS [TrxnID], \r\n[Extent1].[SecondaryVehicleID] AS [SecondaryVehicleID], \r\n[Extent1].[SecondaryVehicleVIN] AS [SecondaryVehicleVIN], \r\n[Extent1].[SecondaryVehicleTypeID] AS [SecondaryVehicleTypeID], \r\n FROM [Activity].[Trxn_SecondaryVehicles] AS [Extent1]\r\n WHERE [Extent1].[TrxnID] = 353 /* @EntityKeyValue1 */",[["Name","Value","Type","Size"],["@EntityKeyValue1",353,"Int32",0]],0,1.15,2325.95,false,null,null,""]],23.15],

[[["Transaction Start","Ordinal","Command","Parameters","Records","Duration","Offset","Async","Transaction End","Errors"],[null,"1","SELECT \r\n[Extent1].[TrxnServiceID] AS [TrxnServiceID], \r\n[Extent1].[TrxnID] AS [TrxnID], \r\n[Extent1].[PackageID] AS [PackageID], \r\n[Extent1].[PartID] AS [PartID], \r\n[Extent1].[Qty] AS [Qty]\r\nFROM [Activity].[Trxn_Services] AS [Extent1]\r\nWHERE [Extent1].[TrxnID] = 353 /* @EntityKeyValue1 */",[["Name","Value","Type","Size"],["@EntityKeyValue1",353,"Int32",0]],0,1.02,2342.92,false,null,null,""]],15.74],

[[["Transaction Start","Ordinal","Command","Parameters","Records","Duration","Offset","Async","Transaction End","Errors"],[null,"1","SELECT \r\n[Extent1].[TrxnNoteID] AS [TrxnNoteID], \r\n[Extent1].[TrxnID] AS [TrxnID], \r\n[Extent1].[NoteText] AS [NoteText], \r\n[Extent1].[NoteNumber] AS [NoteNumber], \r\n[Extent1].[SendToInvoice] AS [SendToInvoice]\r\nFROM [Activity].[Trxn_Notes] AS [Extent1]\r\nWHERE [Extent1].[TrxnID] = 353 /* @EntityKeyValue1 */",[["Name","Value","Type","Size"],["@EntityKeyValue1",353,"Int32",0]],0,1.19,4689.34,false,null,null,""]],21.92]

]},"name":"SQL"}
Run Code Online (Sandbox Code Playgroud)

EF0*_*EF0 6

好吧,我明白了.但首先,请看一下为解决问题需要采用的确切使用方案.

用法场景
只有在以下情况下才会出现问题:
a.为上下文启用了延迟加载.
湾 通过你的EF模型视图中直接和不使用视图模型(这是不好的做法反正,但是这是什么遗留代码在做什么).

我学到了什么
1)事实证明,HUD显示的更高的查询数是正确的 - SQL Server Profiler揭示了这一点.

2)Glimpse本身似乎触发了额外的查询.当我打开元数据选项卡时,它似乎以某种方式访问​​导航属性,导致延迟加载.如果我关闭Glimpse,或者打开Glimpse但禁用Metadata选项卡,则不会发生额外的查询.

解释
我花了一些时间来解决这个问题,因为我搜索了代码并构建了一个测试场景来隔离问题.在其中,我检索了一条记录,之后没有触及任何导航属性.单步执行它,我确信在我的代码中没有访问导航属性导致它 - 但仍然存在所有这些额外的查询由应用程序生成,我对它们来自哪里感到困惑.

我终于放弃了搞清楚,禁用了上下文的延迟加载(这可以防止额外的调用),但随后NullReferenceException又被抛出了一个导航属性.我特意加载了这个特殊的导航属性,所以我更加困惑为什么它是null.在该nav属性上设置一个断点,我发现它被击中了两次 - 一次当我调用它时(当时它不是null),但是我的View/Razor代码完成编译之后第二次,它神秘地是再次打.调用堆栈似乎指向它来自Glimpse.果然,我能够继续完成异常并加载页面(没有错误或缺少数据),但Glimpse在引用该属性的Metadata选项卡中显示错误.我把两个和两个放在一起并尝试打开/关闭Glimpse,然后禁用Metadata选项卡.在任何一种情况下,额外的查询都会停止,并且在Glimpse打开但禁用了"元数据"选项卡的情况下,HUD和SQL选项卡查询计数会匹配.问题解决了.

现在只是为了清楚,我并不是说这是我上述性能问题的原因 - 当性能问题开始时,甚至没有安装Glimpse,据我所知,Glimpse默认情况下在Release模式下是关闭的.性能问题是由代码中发生的一些明显的延迟加载引起的.但是,当我修复代码中发生的延迟加载时,HUD选项卡中的查询计数没有减少太多,性能没有增加 - 现在这是有道理的.对于我从代码中删除的每个延迟加载的查询,Glimpse通过访问"元数据"选项卡的导航属性在后台生成一个查询.



底线/ TLDR:禁用Glimpse元数据选项卡为我解决了这个问题.在调试模式下减少了查询次数和更好的性能,并且Glimpse的HUD与其SQL选项卡之间的查询计数没有差异.