我有一个程序可以让我查看 sql server 中当前正在运行的内容。
此过程不使用 sys.sysprocess,因为它已被弃用。
但是,我正在努力寻找有关导致阻塞的休眠进程所需的信息。
这是因为 DMV sys.dm_exec_requests不保存任何休眠进程的请求。
我不想使用sp_whoisactive或任何监视工具。sp_whoisactive 使用 sys.sysprocesses。
我的会议 81:
BEGIN TRANSACTION T1
SELECT @@TRANCOUNT
update
[TableBackups].[dbo].[spstats]
set execution_count = 1000
where dbname = 'master'
select @@spid
Run Code Online (Sandbox Code Playgroud)
我的会话 51:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SELECT TOP 1000 *
FROM [TableBackups].[dbo].[spstats]
WITH (HOLDLOCK)
Run Code Online (Sandbox Code Playgroud)
上述 2 个会话同时运行,因此会话 81 阻塞了会话 51。
我在下面有这个选择,它获取有关会话 81 的信息,但是,我无法获取 dbid,并且我不确定 Open_transactions 和整个等待信息。
SELECT es.session_id AS session_id
,COALESCE(es.original_login_name, 'No Info') AS login_name
,COALESCE(es.host_name,'No …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 2012 实例上托管的数据库上,我已启用ALLOW_SNAPSHOT_ISOLATION并验证状态为ON使用
SELECT snapshot_isolation_state_desc,name from sys.databases
但是,在 2 个单独的会话中,如果我TABLOCK在第一个和UPDATE第二个中运行长时间运行的选择(反之亦然),无论哪个查询首先开始都会阻止第二个查询(根据sp_who2)
看着
select * from sys.dm_exec_requests , 两个查询的事务隔离级别都是已提交读 (2)
根据我的理解,启用快照隔离后,tempdb 的使用率应该会增加,但在这种情况下不应发生阻塞。我是否缺少一些配置步骤来实现这种行为?
在更新脚本中,我锁定了几个表。
BEGIN TRANSACTION
SELECT Top 0 Null FROM TableA with (holdlock, tablockx)
SELECT Top 0 Null FROM TableB with (holdlock, tablockx)
...
Run Code Online (Sandbox Code Playgroud)
我想抑制它的结果,以便专注于真实的脚本结果。有没有一种优雅的方法来 xlock 表而不获得结果集?
CXCONSUMER当我运行时,我有一些等待时间的查询,sp_whoisactive如下面的屏幕截图所示。
当我检查状态时,它是suspended。这意味着它正在等待某个进程释放资源。据我所知CXPACKET,生产者CXCONSUMER是消费者,而 CXPACKET 是罪魁祸首,应该对此采取行动。但我不”没有看到任何CXPACKET。由于这是一个并行执行,我不确定应该从哪里开始修复。
任何人都可以建议我如何找出我的查询正在等待的过程(因为我将挂起视为状态)?
附加信息
当我查询时sys.dm_os_wait_stats,前两个条目是 CONSUMER 和 CXPACKETS。
performance sql-server parallelism blocking waits performance-tuning
我知道我的数据库上有很多阻塞,并已尽力按供应商进行排序,因为他们支持此应用程序并且尚未产生任何成功的结果。时不时,我们会遇到阻塞问题,这种阻塞变得如此严重,而且他们的设计非常糟糕,以至于整个门户都会关闭,除非我杀死少数持有排他锁的 SPID(大部分)。
我已经使用 sp_blitzindex 近一年了,并且是 Brent Ozar 先生和团队提供的 First Responder Kit 的忠实粉丝。当我对这个发生阻塞的数据库执行 sp_blitzindex 时,它说 - “积极的索引不足:总锁定等待时间 > 5 分钟(行 + 页),平均等待时间长”,优先级为 10。我检查了URL列并还检查了其他相关页面,但无法获得太多帮助。
我知道此处列出的表已编入索引,并且需要创建更多索引,但是当我使用以下命令在表级别为这些对象分别运行相同的过程即 sp_blitzindex 时:
EXEC dbo.sp_BlitzIndex @DatabaseName='db1', @SchemaName='sch', @TableName='tab1';
Run Code Online (Sandbox Code Playgroud)
我根本没有得到任何丢失的索引详细信息。所有现有索引都被利用并且读取计数小于写入计数,只有这里突出显示的问题在主键的“锁定等待”列中。
我不知道需要创建哪个列索引。我还检查了 sp_blitzlock 以查看是否可以收集更多信息,这会有所帮助,但是我看到有很多死锁并且列出了相同的对象,这些对象在积极索引不足中被计算出来。
还通过在此特定数据库中将排序顺序作为“读取”和“持续时间”传递来检查 sp_blitzcache 的输出,但没有丢失索引请求。有警告说“未参数化查询”和“未参数化查询,非 SARGables”,这些计划涉及不同的表集。
任何帮助都受到高度赞赏。
Version: Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) Sep 7 2018 01:37:51 Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 (Build 9600: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud) 我们最近从 LogShippingstandby/read-only设置迁移到具有可读辅助设备的多子网 AG 设置。
通常,在旧设置中,我们会选择运行较长时间的查询,因为相关数据库超过 20 TB,并且主数据库上有混合读写工作负载。
在转移到 AG 的新设置后,我们开始看到我无法理解的阻塞。为什么辅助选择查询会阻止我的可读辅助副本实例中的其他选择查询,即使正在查询的数据库有RCSI enabled?
以下是我捕获的内容
主要阻止程序是一些长时间运行的SELECT查询,不会显示任何特定的等待类型,例如 SPID129
SPID 129阻止会话 ID 45(我确信这不是用户 ID)近 6 小时,这取决于 spid129 并且等待类型是
LCK_M_SCH_M
SPID 45当这在 6 小时的持续时间内阻止所有其他选择查询时,问题就来了。
我无法理解发生了什么。有人可以帮助我排除故障或寻找正确的方向吗?
sql-server isolation-level availability-groups blocking sql-server-2017
我们有一个在大型 J2EE 应用程序中运行的 UPDATE 语句,该语句被其他语句阻塞。更新使用主键,所以它应该只影响一行。应用程序中使用的隔离级别应该是 READ UNCOMMITTED,所以它应该只是导致阻塞的另一个修改,但我们看不到在哪里。
我们已经获得了所有阻塞事务的报告,这确实显示了一个阻塞更新的会话。使用DBCC INPUTBUFFER命令显示阻塞会话执行的最后一条语句,但这是另一个表上的 SELECT 而不是 UPDATE,所以我认为它不可能是原因。我认为它必须是交易中较早的声明。
至此,我的SQL Server知识枯竭,重现问题也有问题;它间歇性地发生。
我应该知道采取哪些步骤来查找阻塞语句?
我已经实现了 XE 来捕获我的实例上的阻塞(根据这篇很棒的文章https://www.brentozar.com/archive/2014/03/extended-events-doesnt-hard/#comment-2470072。)
我这样做是因为我一直关注阻塞状态,使用查询的这种美:
select
db_name(database_id) DB,
object_name(object_id) Obj,
row_lock_count + page_lock_count No_Of_Locks,
row_lock_wait_count + page_lock_wait_count No_Of_Blocks,
row_lock_wait_in_ms + page_lock_wait_in_ms Block_Wait_Time_in_ms,
index_id
from
sys.dm_db_index_operational_stats(NULL,NULL,NULL,NULL)
order by
Block_Wait_Time_in_ms desc
Run Code Online (Sandbox Code Playgroud)
偶尔会在文件中记录一些阻塞,但没有我预期的那么多。我的期望是查询中 No_Of_blocks 中的数字将与根据 XE 记录到文件中的块数相对应。
与查询相比,XE 是否可能无法捕获任何内容?有任何想法吗?感谢您的反馈意见!
寻求专家就短期封锁提供建议,我们现在已经看到了近一周的时间。
DB 是 15 TB,而我们有很多阻塞的这个表 B - 几乎有 300 个是 2 TB。
在使用 sp_whoisactive 时,我看到查询在 3-4 秒的较短部分内被阻塞,有些在 9-10 秒内被阻塞,但由于这些查询几乎一整天都在连接超过 2-3 千个,这会导致应用程序中出现大量错误。
故障排除:
以下是一些指标:
结果根据 david …
我们很少有查询每 5 秒将它们的状态检查到一个表中并更新它们的状态。
下面是查询的样子(所有表列都在更新查询中)
update table1
set
Name='somename'
DetailMessage='Error'
LastUpdate=getdate()
where id=14
Run Code Online (Sandbox Code Playgroud)
最近这个表遇到了阻塞问题,上面的更新查询是主要的阻塞器。当我运行时Sp_Blitzindex,它显示没有丢失的索引,284 分钟的行锁争用..
以下是我到目前为止所做的几个步骤.. 1.
确保外键被索引(它们也是主键)
2.为可以从新索引中受益的选择语句创建索引,以便减少对该索引的锁争用
3.我还将 Fillfactor 减少到 10,以前每页用于存储 93 行,现在它每页只存储 7 行(仍然无法给自己一个 100% 的逻辑解释,说明此更改将如何帮助...)
任何进一步的建议..如果您需要任何进一步的细节,请告诉我
下面是表的架构(更改的列名),表只有 350 行,查询以每 5 秒 20/30 次查询的频率更新此表...
create table dbo.table1
(
[ID] [int] NOT NULL,
[Name] [varchar](500) NULL,
[DetailMessage] [nvarchar](max) NOT NULL ,
[LastUpdate] [datetime] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
PS:这是第三方查询,我们无法通过更改隔离级别等更改来修改源数据库...我只能添加索引
SQl 版本:SQl 2012
blocking ×10
sql-server ×10
waits ×2
dmv ×1
index ×1
locking ×1
parallelism ×1
performance ×1
transaction ×1