我有一个用户每天早上 8 点进来,下午 6 点离开,每天我都在 SolarWinds DPA 中看到相同的奇怪模式。
当用户锁定屏幕时,Excel 似乎正在刷新查询表。我的问题是:
- 有没有办法阻止 Excel 这样做?我不能是唯一一个与此类问题作斗争的 DBA。
- 有什么办法可以在我的机器上重现问题吗?
- 帮助查找 Google 关键字以搜索已知问题...我尝试过不成功
更新
我突然想到这里可能还有其他因素在起作用,所以这里是:
- 该文件位于工作组共享的网络附加存储驱动器上。
- 我调查了可能导致 Excel 认为文件句柄丢失的各种网络接口卡省电功能问题 (???)
- 在连接属性下选中“打开文件时刷新数据”
- 这可能发生在虚拟机上。
ASYNC_NETWORK_IO
如果发送给客户端的结果从未在任何地方假脱机(例如,通过ORDER BY
强制排序的子句tempdb
),则可能导致数据库争用问题。如果 Excel 出现此问题,则问题可能是由于在后台线程上刷新 Excel 数据库连接,并且用户在后台刷新期间同时锁定了他们的计算机。当后台线程完成时,计算机被锁定。问题是在 Win32 中,锁定的计算机意味着用户会话对象不可用。当用户会话对象不可用时,后台线程无处可返回结果,它只是挂起,等待 Excel.exe 读取结果。因为结果永远不会在任何地方假脱机,
ASYNC_NETWORK_IO
锁会导致任何先前获得的锁上的活锁。本身ASYNC_NETWORK_IO
是无害的。造成损坏的是锁链。总结起来,这个问题可能在以下两种情况下发生:
ORDER BY
触发排序tempdb
,因为数据太大而无法在内存中完全排序)或显式(INSERT
结果到tempdb
表中,SELECT
在 tempdb 表上执行,这会释放活锁)。两种选择:
一个。将查询结果写入临时表。将临时表返回给用户。
湾。另外,不要忘记在存储过程的顶部设置 NOCOUNT ON,以避免由于 DONE_IN_PROC TDS 消息被发送到客户端而导致往返延迟。
一个。检查 NIC 是否配置错误,或者客户端是否使用 VM 并且 VM 的 NIC 是否配置错误。见:https ://www.reddit.com/r/sysadmin/comments/2k7jn5/after_2_years_i_have_finally_solved_my_slow/
湾。使用 Perfmon 进行测量。Microsoft 对 PerfMon 网络输出队列长度使用 10 的启发式方法。请参阅:https ://technet.microsoft.com/en-us/library/aa997365(v=exchg.80).aspx
C。添加 Query BeforeRefresh 和 AfterRefresh 事件处理程序以检测工作表中的日志记录线索,以确定用户在做什么。特别是,请参阅“XL2000:如何使用查询 BeforeRefresh 和 AfterRefresh 事件”: https: //support.microsoft.com/en-us/help/213187/xl2000-how-to-use-the-query-beforerefresh-刷新后事件
d。编写一个缓存其 SQL 调用的 Excel 加载项。
2018 年 1 月 19 日更新
我仍在处理 Excel 用户的高 ASYNC_NETWORK_IO 问题。我相信我已经找到了更多潜在的原因,但这些只是目前的理论:
如果您在同一个电子表格中有多个表格,并且右侧的最后一个表格的行数比左侧的表格多,这似乎会导致 Excel 经常“闪烁”。相应地,在 SolarWinds Database Performance Analyzer 中,此电子表格上返回最多行和列的查询也具有最高的 ASYNC_NETWORK_IO 问题。(对我来说,接下来的步骤是重现这个问题,但我不确定这是否值得我花时间,因为我说服了一位用户他们现在根本不需要这么大的结果集。)
我在专家交流 ( https://www.experts-exchange.com/questions/25049176/Slow-queries-excuted-throug-network-ASYNC-NETWORK-IO.html )上发现了一条评论,其中有人说 5,000 行结果或更高因引起问题而臭名昭著。这似乎实际上是 Microsoft Dynamics NAV 应用程序内部提出的建议,该应用程序因高 ASYNC_NETWORK_IO 等待导致 SQL Server 不稳定而臭名昭著。应用程序引发的错误消息是,“表中的记录数超过了最大数 5000。设置过滤器以减少表中的记录数。一次导出太多记录会影响系统性能。” 但这只是一个猜测。
对于 SSIS Excel 目标任务,如果用户无权写入 Temporary Internet Files 文件夹,那么它可能会挂起:https ://stackoverflow.com/a/23523954/1040437 (同样,我使用这个只是一个理论试图将所有可能的理论整理到一个地方。)