标签: blocking

SSRS 阻塞进程

我们有一个繁忙的 SSRS 报告服务器 (SQL Server 2008 R2),我们看到以下进程之间频繁阻塞:

  • [dbo].[CheckSessionLock]
  • [dbo].[WriteLockSession]

我们知道有些报告的运行速度慢得令人无法接受。我需要知道的是 ReportServer 数据库中的阻塞是否是服务器过载的征兆,或者阻塞是否导致报告运行缓慢。

我倾向于相信这是第一个案例,但无法收集证据明确证明它是这样的。

我已阅读https://connect.microsoft.com/SQLServer/feedback/details/698388/blocking-in-ssrs-reportserver-database 上的线程,其中问题得到了松散承认,但我无法访问引用的链接以解决问题这个问题。

有没有人解决了在 ReportServer 数据库中阻塞的相同问题?

performance sql-server ssrs blocking

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

如何防止大量 SELECT 阻塞其他语句?

我们的 SQL Azure 数据库包含一个SELECT每天运行一次的大量语句。沉重的SELECT语句不包含锁定提示。最近我们观察到生产中的一些停顿,这sys.dm_exec_requests是那段时间显示的内容......运行时间最长的查询是SELECT具有PAGEIOLATCH_SH等待类型的繁重查询。接下来是其他查询——最常见的INSERT是具有PAGEIOLATCH_EX等待类型的语句,所有语句都运行了几十秒而不是立即完成。所以基本上,SELECT只有重才会干扰其他查询。

我该如何解决?我可以接受SELECT缓慢运行的繁重工作,但不应中断其他查询。

performance sql-server azure-sql-database blocking query-performance

7
推荐指数
1
解决办法
2273
查看次数

查找先前的语句或在阻塞情况下持有锁

我正在使用 XEblocked_process_report 来检测和分析阻塞。
但由于这是一个时间点情况,我只能看到当前正在运行的阻塞领导者的语句以及被阻塞会话试图获取的不兼容锁。

因此,如果阻塞领导者在一个事务中有多个批次/语句,我无法找出之前的哪个语句导致阻塞。

重现脚本

/* Set up tables */
CREATE TABLE dbo.FirstQuery (Id int PRIMARY KEY)
CREATE TABLE dbo.SecondQuery (Id int PRIMARY KEY)

INSERT INTO dbo.FirstQuery (Id)
OUTPUT Inserted.Id INTO dbo.SecondQuery ( Id )
VALUES (1), (2), (3)

/* set up the blocked process event */

EXEC sys.sp_configure
        @configname = 'blocked process threshold (s)' -- varchar(35)
      , @configvalue = 10 -- int
    
RECONFIGURE 

CREATE EVENT SESSION [blocked_process_report] ON SERVER 
ADD EVENT sqlserver.blocked_process_report
(
    ACTION(sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack)
)
GO
ALTER EVENT …
Run Code Online (Sandbox Code Playgroud)

monitoring sql-server blocking sql-server-2019

7
推荐指数
0
解决办法
197
查看次数

SQL Server更新锁是如何工作的?

我正在学习 SQL Server 并试图了解 SQL Server 如何更新行。

据我了解,SQL Server首先对数据库加一个意向排它锁,然后对表加一个意向排它锁,然后对要更新的记录加一个更新锁。稍后,它将将该行上的更新锁转换为排他锁,以便可以修改该行中的数据。

但问题是共享锁与更新锁兼容。因此,虽然该行有更新锁,但其他会话仍然可以使用共享锁读取该行。如果行上有共享锁,则无法将更新锁转换为排它锁,因为共享锁排它锁不兼容。

这是否意味着如果有会话连续读取该行,SQL Server 根本没有机会更新该行。这种情况可能会持续很长一段时间。这是真的?SQL Server 会等到该行上没有共享锁时才开始更新其中的数据吗?

我所说的“连续”是指一个会话读取该行,并且在从该行释放共享锁之前,另一个会话在同一行上放置一个共享锁。在第二个共享锁从该行释放之前,另一个会话在同一行上放置另一个共享锁,依此类推。因此,基本上,该行上总是至少有一个共享锁。

sql-server locking update blocking

7
推荐指数
1
解决办法
1227
查看次数

Blocking_session_id 怎么可能是负 2?

我有一个案例,我正在运行的查询需要很长时间。当我检查sys.dm_exec_requestsblocking_session_id是一个负值时,具体来说是-2。等待是一个LCK_M_X,阻塞的命令是一个DELETE语句。据我所知,目前没有其他东西触及那张桌子。事实上,唯一的活动请求是被阻止的连接和查询检查sys.dm_exec_requests。当我查看sys.dm_tran_session_transactions被阻止的会话时,只有一个出现。

sql-server-2008 sql-server blocking

6
推荐指数
1
解决办法
1068
查看次数

如何解决 tempdb 上的阻塞

我在其中一台服务器(SQL Server 2008 R2)上有 tempdb 争用(我猜,至少)。

拦截器和服务员(其中 10 个)在数据库 tempdb 上都具有 PAGELATCH_EX 等待类型,并且所有会话(拦截器和服务员)的等待资源都是“2:1:122”。

我检查了 SQL 代码,发现在大多数会话中都创建了表变量,我怀疑这可能是罪魁祸首。

任何有关如何进一步诊断和缓解此问题的建议表示赞赏。

sql-server sql-server-2008-r2 tempdb wait-types blocking

6
推荐指数
1
解决办法
3212
查看次数

重新启动后在可读二级上出现奇怪的阻塞

我们正在运行一个带有 3 个副本的 SQL Server 2014 可用性组,一个同步(SQL2)和一个异步辅助副本。我们还配置了到同步辅助副本的只读路由。

昨晚 SQL2 从自动 Windows 更新安装重新启动。服务器重新上线,SQL Server 服务启动(延迟启动),数据库进入恢复状态。过了一会儿,事件查看器显示数据库完整性检查成功,数据库可以使用了。

数据库在 SQL Management Studio 中显示同步状态。AG 状态正常,但没有查询从数据库中获取结果。

查询被等待类型阻止:HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING。

有时,等待类型更改为“lck_m_s”等待类型,并被执行数据库启动命令的进程的 pid 阻止。我知道这与 SQL Server Enterprise 附带的快速恢复选项有关,但我不明白为什么一个简单的选择会被永远阻止。

主要问题是:SQL Server 如何显示 AG 数据库是健康的,但实际上并非如此?你认识这个问题吗?

为了解决这个问题,我们从 AG 中删除了辅助数据库,并将数据库重新加入到 AG 中,现在一切又恢复正常了。

sql-server wait-types availability-groups blocking sql-server-2014

6
推荐指数
1
解决办法
618
查看次数

为什么 SQL Server 的在线索引会导致阻塞?

我的理解是在线索引在开始(准备)和结束(最终)阶段获取锁。但是,我们看到很多 DML 查询在构建阶段被阻塞。

被阻止的查询的样本显示它们有一些共同点 - 等待类型是 PAGELATCH_UP,等待资源引用 PFS 页面,并且查询使用锁定提示(NOLOCK、ROWLOCK 等)。锁定提示会干扰吗?

任何人都可以在这里阐明或指出我正确的方向吗?

让我补充一下,实际命令是:

ALTER TABLE dbo.Whatever DROP CONSTRAINT [PK_Whatever] WITH (ONLINE=ON);
Run Code Online (Sandbox Code Playgroud)

这是聚集索引,没有非聚集索引。

sql-server-2008 sql-server blocking

5
推荐指数
1
解决办法
1525
查看次数

SQL Server 2012 - 如何查看锁的日志?

我使用的是 SQL Server 2012 Express Edition,请问如何查看数据库中记录的所有锁定/块进程?我想查看以前锁定/阻塞的进程的原因是SQL Server只允许我们查看数据库中当前锁定的进程。

我发现我的 SQLException 日志文件中几乎没有超时错误,所以我想知道是否有一种方法可以查看或查询导致超时的锁/块的过去记录。

我没有打开数据库 TT 的阻止进程报告

sql-server-2012 locking blocking

5
推荐指数
1
解决办法
1万
查看次数

不返回任何记录的查询挂在锁上

我们注意到这种奇怪的情况,即不返回任何记录的查询将在WITH(UPDLOCK)指定时等待锁定。

查询很简单

SELECT primaryKey FROM someTable WITH(UPDLOCK) 
WHERE columA = 'A' 
      AND columnB BETWEEN 6 AND 8 
      AND columnC != 'C' ;
Run Code Online (Sandbox Code Playgroud)

运行此查询的系统使用隔离级别read uncommissed,我们无法更改该级别。

有没有一种方法,例如提示,不会让这个等待,但如果它会产生结果,仍然锁定记录?

我注意到索引的使用在其中发挥了作用,因为其他查询没有这种行为。但遗憾的是,定义索引也不可能。

我想出的唯一解决方案是IF EXISTS在执行实际查询之前在其中抛出一个,但由于竞争条件,它仍然可能发生。

类似的问题已在这里得到解答:Why does UPDLOCK Causes SELECTs tohang (lock)?

如果没有索引来定位要锁定的行,则所有测试行都将被锁定,并且合格行上的锁将被保留,直到事务完成。

但我不认为那里提供的答案适用于我的问题版本,因为查询不会返回“合格”的行。

遗憾的是我无法访问该系统。我们只能对某些表运行查询。

目的是锁定并读取记录(如果存在)并最终更新它。如果缺失则插入。

UPDLOCK使用它是因为根据我的理解,当锁定读未提交隔离时,这是正确的。

该表有主键,但在 where 子句中未使用它。

sql-server locking blocking

5
推荐指数
1
解决办法
983
查看次数