【问题标题】:Any way to see incoming buffer/records from SQL Server?有什么方法可以查看来自 SQL Server 的传入缓冲区/记录?
【发布时间】:2014-07-08 18:09:33
【问题描述】:

基本上我有一堆性能分析,[考虑到天真的解释]声称 70% 的时间都花在了我们的 web 应用程序在重负载下的同步上,而且主要是在数据读取器内部调用的 SNIReadSyncOverAsync 上。 (SNIReadSyncOverAsync 实际上最终位于 kernalbase.dll 上!WaitForSingleObjectEx)看看这些等待是调用者发起还是被调用者发起的将是有益的。

有没有办法在 Visual Studio 争用或并发报告中查看(解释)这一点?还是其他方式?

对于我的理解更重要的是,有没有办法在数据读取器消耗数据之前查看保存数据的传入缓冲区?

【问题讨论】:

  • 也许这不是您想要的,但您知道使用SQL Profiler 可以查看sql server 实例上发生的所有请求吗?
  • 是的。 :) Profiler 很棒。这个问题一半是好奇,一半是实用主义。当从 SQL 服务器接收数据时,我对缓冲区中客户端发生的情况感兴趣。从一个实用的笔记来看,我试图弄清楚应用程序是否使客户端(I/O?)缓冲区保持相对空或是否填满。如果 SQL Profiler 可以提供特定于应用程序的客户端统计信息,它可能会起作用,但我不知道是否存在此功能。如果它解决了我的问题,但出于好奇,我仍然想知道上述内容。

标签: sql .net sql-server performance concurrency


【解决方案1】:

看来我的问题是不明智的。

数据读取器一次读取一条记录,但它从 底层数据库驱动程序。数据库驱动程序从 以块为单位的数据库,通常使用 8 KB 的缓冲区。

如果您的结果记录很小并且您得到的不是很多,它们 将全部放入缓冲区中,并且数据库驱动程序将能够 将它们全部提供给数据阅读器,而无需询问数据库 获取更多数据。

如果你获取的结果大于缓冲区,你只会 能够读取它的第一部分以及何时不存在数据 网络缓冲区然后 datareader 将通知 sql server 发送下一个 数据块。

How much data can be stored in network buffer when datareader is used

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多