如何解决 tempdb 上的阻塞

Sta*_*ser 6 sql-server sql-server-2008-r2 tempdb wait-types blocking

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

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

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

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

sta*_*ray 1

PAGELATCH_XX - 这表明 SQL 正在等待访问数据库页面,但该页面没有进行物理 IO。此类问题是由大量 spid 尝试同时访问同一物理页引起的。wait_resource 是正在访问的页号(格式为 dbid:file:pageno)。如果在实时服务器上进行诊断,性能仪表板报告将运行 DBCC PAGE 并显示输出,告诉您争用的页面对象和类型(分配、数据、文本……)

由于 SQL 最常等待的页面位于 tempdb 数据库中(dbid 2 中的页面编号),因此您可能会面临 tempdb 分配闩锁争用。

每秒数百或数千次创建和销毁临时对象(包括用于排序或哈希操作的工作表/工作文件)的工作负载可能会发生 Tempdb 分配页锁存争用。

解决 -

1.实现跟踪标志-T1118。

2.增加 tempdb 中的数据文件数量,以最大化磁盘带宽并减少分配结构中的争用。作为一般规则,如果逻辑处理器的数量小于或等于 8,则使用与逻辑处理器相同数量的数据文件。如果逻辑处理器的数量大于 8,则使用 8 个数据文件,然后如果争用继续存在,则将数据文件的数量增加 4 的倍数(最多为逻辑处理器的数量),直到争用减少到可接受的水平或使工作负载/代码的更改。