Sql server SQL Server数据包超时

Sql server SQL Server数据包超时,sql-server,Sql Server,我们有SQL Server 2016(v13.0.4206.0),默认情况下,并行性没有任何限制-SQL想要的任何数量。它没有导致任何问题。。。直到现在 对于另一个特性,有一个书面查询意外地在应用程序中引发超时异常。当它成功地将每个查询的最大线程数设置为1时,我感到非常惊讶。是的,6秒的查询时间不是很好,甚至占去了大部分的时间用于抓取,但距离3分钟的超时时间还很远 顺便说一下,尽管有并行性设置,但使用SQLServerManagementStudio执行此查询始终有效。似乎和数据库的连接有问题,

我们有SQL Server 2016(v13.0.4206.0),默认情况下,并行性没有任何限制-SQL想要的任何数量。它没有导致任何问题。。。直到现在

对于另一个特性,有一个书面查询意外地在应用程序中引发超时异常。当它成功地将每个查询的最大线程数设置为1时,我感到非常惊讶。是的,6秒的查询时间不是很好,甚至占去了大部分的时间用于抓取,但距离3分钟的超时时间还很远

顺便说一下,尽管有并行性设置,但使用SQLServerManagementStudio执行此查询始终有效。似乎和数据库的连接有问题,但所有其他查询都可以正常工作,甚至比那个查询困难得多

我们的应用程序是基于ASP.NET Core 3.0构建的(不知道是否重要),数据库连接是使用
System.Data.SqlClient v4.8.0
进行的。我所能确定的是,为这个查询创建了这么多任务:

我试着在
sys.dm_os_waiting_tasks
中观察执行情况(感谢谷歌)。我不确定我是否正确,但似乎具有
context\u id
0-8的任务被那些具有
context\u id
9-16的任务阻止,反之亦然。死锁的明显例子,不是吗?但是,如果没有我的“帮助”,SQL Server如何管理线程?或者我做错了什么

以防一些不恰当的回答:

  • 我不会将并行性关闭(将每个查询的最大线程数设置为1)作为解决方案,因为我们的应用程序中存在一些繁重的查询


  • 我不想提高并行性的
    成本阈值
    设置,因为我担心另一个查询会出现同样的问题(猜,是一个更重的查询)。所以我只想确定真正的原因

  • 优化查询不再被考虑,因为根据实际的执行计划,我不能让它更快——有足够的索引。但在一些非常重要的争论之后,我准备重新思考


所以,我的问题是:为什么我没有要求的并行性会破坏查询执行?我怎样才能避免这种情况呢?

有时引擎选择使用并行执行(或不使用)会导致性能下降

您不想控制服务器选项和成本,因为您不确定这将如何反映到其他查询中,这是可以理解的

如果您确信,您的查询在没有并行处理的情况下会执行得更好,那么您可以使用-MAXDOP为其指定选项,如下所示:

SELECT ...
FROM ...
OPTION (MAXDOP 1);
这很简单,如果需要,您可以回滚。此外,您不会影响其他查询

你是说:

不再考虑优化查询,因为根据实际执行计划

执行计划有时具有误导性。首先,您可以保存执行计划并使用SentryOne plan Explorer打开它,它是免费的,可以让您更好地了解正在发生的事情


此外,如果查询执行时间为3秒或6分钟,则该查询一定有问题,或者可能是数据库的活动。如果总是在SSMS中快速执行,则可能引擎使用了正确的缓存计划。我认为最好是共享查询本身,并附加两个计划(串行和并行),并花更多时间对其进行调优。

有时引擎选择使用并行执行(或不使用),这会导致性能下降

您不想控制服务器选项和成本,因为您不确定这将如何反映到其他查询中,这是可以理解的

如果您确信,您的查询在没有并行处理的情况下会执行得更好,那么您可以使用-MAXDOP为其指定选项,如下所示:

SELECT ...
FROM ...
OPTION (MAXDOP 1);
这很简单,如果需要,您可以回滚。此外,您不会影响其他查询

你是说:

不再考虑优化查询,因为根据实际执行计划

执行计划有时具有误导性。首先,您可以保存执行计划并使用SentryOne plan Explorer打开它,它是免费的,可以让您更好地了解正在发生的事情


此外,如果查询执行时间为3秒或6分钟,则该查询一定有问题,或者可能是数据库的活动。如果总是在SSMS中快速执行,则可能引擎使用了正确的缓存计划。我觉得最好是共享查询本身,并附加两个计划(串行和并行),并花更多时间对其进行调整。

不管怎样,“并行的成本阈值”应该是50,但这不是你的问题……你的统计数据是最新的吗?@MitchWheat,你是说“不寻常”吗?
cxpack
等待是并行性的自然产物。我建议您首先查看查询和索引优化,这样SQLServer就不需要在查询中抛出线程来加快运行速度。如果您需要帮助,请将实际计划上载到。您看到的不是僵局(这将完全阻碍进度);您看到的查询部分不能有效地并行化,必须串行执行,因此其他任务在继续之前等待该部分完成。引擎通常渴望使用并行性,但往往无法有效地使用它。除非你想自己重写引擎,否则你必须开始考虑一些你现在拒绝的方法。如果所有其他方法都失败了,可以使用强制执行计划来更改一个查询的行为,而无需重写任何内容。“并行性的成本阈值”无论如何应该是50,但这不是你的问题……你的统计数据是最新的吗?@MitchWheat,你的意思是说“不寻常”吗?
cxpack
等待是并行性的自然产物。我建议您首先查看查询和索引调优,这样SQLServer就不需要抛出