小编use*_*827的帖子

计划缓存中的串行计划

我有一个较早执行缓慢的查询。后来我发现它没有并行运行,这使得查询执行速度变慢。

查询涉及一个 big view,然后使用大量temp tablesand查询视图sub query

UDF从视图中删除了一个并使用inline functions并使用了一个标量TVF,然后它开始在parallel execution.

这几天一切顺利,有一天我注意到查询运行缓慢。于是查了一下执行计划,发现查询是在串行模式下执行的。我检查了查询的计划缓存,我看到了很多涉及该视图的缓存计划。我删除了不并行的计划,然后查询运行得很快。

现在我每天早上都这样做以强制查询并行运行。

额外细节:

  1. SQL Server 2016 标准版
  2. 查询通过 LINQ-SQL 从 dot net 应用程序生成。所以临时查询。

如何强制查询永远并行运行?

performance sql-server optimization parallelism plan-cache query-performance

2
推荐指数
1
解决办法
426
查看次数

连接池错误

我从我的 .net 应用程序中收到以下错误。

Source: xxx.Services.xxx.xxx.xxxx.xxxx.xxxxRequest
    ---
    System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.
Run Code Online (Sandbox Code Playgroud)

我看过几篇关于这个连接池错误的帖子。我已经阅读了其中的大部分内容,我明白为什么会发生这种情况,以及应用程序端的可能解决方案,比如关闭应用程序打开的连接。这些是我的理解:

  1. 打开的连接并没有关闭,称为连接泄漏。
  2. 正在使用 100 多个并发连接。如果我们有 100 个以上的并发用户,请增加连接字符串中的最大池大小。
  3. 缓慢的查询或打开的事务会阻止新连接。当连接被慢速查询执行/打开事务保持打开时,而不是重用连接,新连接将打开并最终达到连接池最大值。

我如何从数据库端监控这一点。我看到了一些建议,例如使用 sp_who 或 sp_who2 查看现有会话。当我看到这些错误时执行 sp_who2 时,我看到很多活动会话,但是我怎么能看到连接池池下的信息和连接。问题:

  1. 有什么方法可以跟踪打开的连接并将其与从数据库端创建的连接池相关联。

我注意到当问题发生时,通常运行得更快的查询会变慢。

  1. 这是预期的吗?因为我怀疑慢查询是否导致连接池错误。

sql-server transaction connection-pooling timeout

2
推荐指数
1
解决办法
1921
查看次数

使用资源调控器并分配更多内存以满足查询的高内存授予请求?

在 SQL Server 2016 数据库服务器上,我几乎没有查询非常慢并且需要更多内存(查询未优化)。这使得整个数据库变慢,因为许多用户正在运行相同的查询。这导致其他查询等待。我CXCONSUMER等待(由于并行执行)和RESOURCE_SEMAPHORE.

所以这造成了内存压力(我相信这些缓慢的查询正在为其他查询造成内存争用,进而造成内存压力),我认为这导致我的计划缓存以固定的时间间隔清除。

我读到默认情况下Memory Grant %为 25%。我正在考虑增加这 25% 来为查询提供内存。我现在正在尝试暂时解决这个问题。

未优化的查询是 LINQ 查询,更改将需要团队一些时间。

所以请建议在资源调控器中增加Memory Grant %是否是一个好主意?

我总共有 128GB RAM,其中 75% (102 GB) 分配给 SQL Server。

sql-server memory resource-governor waits

2
推荐指数
1
解决办法
379
查看次数

报告具有许多写操作和很少读操作的 SQL 数据库服务器

我知道这是一个笼统的问题,但我必须澄清一些基本问题。
我知道当对 SQL Server 数据库表进行写入时,对该表的读取将不得不等待。
我的问题是:我正在使用的 SQL 数据库服务器暴露于多次写入和少量读取。一些 SSRS 报告也在同一台服务器上运行。

  1. 适应这种情况的理想或推荐方法是什么?

我知道最好从同一数据库的重复实例执行报告。但是对于一些报表,是否值得设置一个重复的实例进行报表?

有时我会抱怨某些报告运行缓慢。

  1. 它可以是写发生时的读等待吗?

sql-server locking reporting blocking

0
推荐指数
1
解决办法
57
查看次数

删除查询阻塞其他并发事务

DELETE我的生产 SQL 服务器中的查询导致死锁。我知道 DELETE 导致了这种情况,因为我检查了扩展事件并检查了死锁 XML 并发现此 DELETE 正在阻塞,这最终导致死锁。

所以DELETE是发生在两个表格,TB1和TB2。tb1 的主键在 tb2 中可用作外键,并CASCADE DELETE在 tb2 外键中使用。

我什Allow Page LocksFALSE在 tb1 和 tb2 中创建了聚集索引,但仍然没有运气。

我想READ COMMITTED SNAPSHOT在我的数据库中尝试之前尝试所有其他选项。

任何帮助将不胜感激。

附加信息:

使用READ COMMITTED SNAPSHOT也是一个挑战,因为它涉及风险。

  • 我的数据库大小很大(~1.6 TB),RAM 为 128 GB。
  • 使用 SQL Server 2016

这是 XDL

<deadlock>
 <victim-list>
  <victimProcess id="process257a65d6ca8" />
 </victim-list>
 <process-list>
  <process id="process257a65d6ca8" taskpriority="0" logused="6024" waitresource="KEY: 6:72057794784329728 (bb7a6e52eae1)" waittime="4485" ownerId="45816472292" transactionname="user_transaction" lasttranstarted="2019-01-08T11:30:06.837" XDES="0x24883ec2a70" lockMode="RangeS-U" schedulerid="26" kpid="39320" status="suspended" spid="217" sbid="2" …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock delete locking sql-server-2016

0
推荐指数
1
解决办法
1019
查看次数