小编jes*_*esi的帖子

如何跟踪发生不到一秒的阻塞 - SQL Server

我正在尝试解决发生不到一秒钟的阻塞问题。OLTP 应用程序非常敏感,根据商定的 SLA,某些事务的响应时间必须小于 200 毫秒。我们在新代码版本中遇到了一些锁升级问题,我们能够通过减少更新中的批量大小来解决这些问题。即使批量较小,我们也怀疑新的 sp 阻塞了 OLTP 事务正在更新的相同行。

我需要找到被阻塞的会话及其等待的资源。根据我的理解,“阻塞进程阈值”可以设置至少 1 秒,因此这不会捕获阻塞。

我正在试验 wait_info 和 wait_completed x 事件。

有没有其他方法可以跟踪这个。谢谢

performance sql-server sql-server-2014 query-performance performance-tuning

14
推荐指数
2
解决办法
1018
查看次数

>= 和 > 的基数估计,用于步骤内统计值

我试图了解 SQL Server 如何尝试估计 SQL Server 2014 中的“大于”和“大于等于”where 子句。

我想我确实了解基数估计,例如,如果我这样做

    select * from charge where charge_dt >= '1999-10-13 10:47:38.550'
Run Code Online (Sandbox Code Playgroud)

基数估计是 6672,可以很容易地计算为 32(EQ_ROWS) + 6624(RANGE_ROWS) + 16 (EQ_ROWS) = 6672(下面截图中的直方图)

在此处输入图片说明

但是当我这样做时

    select * from charge where charge_dt >= '1999-10-13 10:48:38.550' 
Run Code Online (Sandbox Code Playgroud)

(将时间增加到 10:48 所以它不是一步)

估计是 4844.13。

那是怎么计算的?

performance sql-server sql-server-2014 cardinality-estimates performance-tuning

10
推荐指数
2
解决办法
538
查看次数

无法截断事务日志,log_reuse_wait_desc - AVAILABILITY_REPLICA

今天早上,我被我们的一个数据库上的事务日志已满警报唤醒。这个服务器是一个alwayson 集群,也是一个事务复制订阅者。我检查了 log_reuse_wait_desc,它显示了 logbackup。4 天前有人不小心禁用了 logbackup 作业,我重新启用了日志备份作业,日志被清除了。由于是凌晨 4 点,我想我会在那天早上晚些时候去办公室并缩小日志,因为它已经增长到 400GB。

上午 10 点 - 我在办公室,我在缩小之前检查了日志使用情况,大约是 16%。我很惊讶并检查了 log_reuse_wait_desc,它显示了复制。我很困惑,因为这是一个复制订阅者。然后我们看到 db 为 CDC 启用,并认为这可能是原因,因此禁用 CDC,现在 log_reuse_wait_desc 显示 AVAILABILITY_REPLICA。

与此同时,日志使用量仍在稳步增长,目前为 17%。我检查了alwayson仪表板并检查了发送和重做队列,两者几乎为零。我不确定为什么日志重用显示为 AVAILABILITY_REPLICA 并且无法清除日志。

知道为什么会这样吗?

sql-server transaction-log availability-groups transactional-replication sql-server-2014

10
推荐指数
2
解决办法
8598
查看次数

变量嗅探?

这可能是愚蠢的,感觉就像我要回去尝试理解基础知识。

所以我创建了一个如下所示的测试表并在其上创建一个聚集索引

create table test( c1 int)

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 1 
SET @Upper = 10000 
while 1=1
begin
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
insert into test SELECT @Random
end 

create clustered index cidx on test(c1)
Run Code Online (Sandbox Code Playgroud)

现在我使用实际执行计划运行以下查询

DECLARE @Min INT

SET @Min = 216 --selected this cause this was a histogram step

select * from test  where c1 = @Min
select * from test  where …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2014 query-performance performance-tuning

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

流聚合排序?

在此处输入图片说明

试图理解上述查询计划中的几件事。

  • 当我没有 group by 时,为什么查询中有一个 Stream Aggregate。我猜这与合并的连接及其进行排序有关?

  • 其次,更重要的是,为什么 13
    进入流聚合的估计结果是 24,595,900?这导致了 Object4 获取聚集索引而不是嵌套循环的次要问题。我不得不将查询拆分为两个查询,而不是使用 OR,并且连接变成嵌套循环并查找到 Object4。

查询计划

https://www.brentozar.com/pastetheplan/?id=BJk2eFLul

performance sql-server sql-server-2008-r2 cardinality-estimates query-performance

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

排序运算符在执行计划中的定位

我正在对性能问题进行故障排除并尝试为报告查询获得稳定的执行计划。实际计划的链接如下:

VS

如果您查看 Good 计划,则排序是在表连接之后进行的。对于糟糕的计划,排序就在最后一个连接之前。在错误计划的情况下,因为排序在最后一个连接之前,并且排序的估计行数为 5000,SQL Server 决定使用嵌套循环连接,这会减慢查询速度。

我不想使用表连接提示或更改TOP.

在这种情况下,我可以使用哪些策略来获得一致的计划?

此查询大约每 5 分钟运行一次。

performance sql-server execution-plan sql-server-2014 query-performance

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

选择并插入链接服务器

我遇到了无法理解的链接服务器的情况。

所以我们有一个从 2008R2 服务器到 2014 服务器的链接服务器。下面的示例查询是从 2008R2 服务器执行的,并且工作正常。

SET XACT_ABORT ON;
 Declare @BatchSize int = 10
      DELETE from LINKEDSRV.DB.DBO.Table
      INSERT INTO LINKEDSRV.DB.DBO.Table (ECN)
      SELECT TOP (10) C1 from LINKEDSRV.DB.DBO.Table22 --order by C1
      SELECT * FROM LINKEDSRV.DB.DBO.Table
Run Code Online (Sandbox Code Playgroud)

但是当我用order by C1它执行同样的事情时,它不会返回任何结果。

第二种情况 - 如果我替换TOP(10)withTOP(@BatchSize)和 noorder by也不会得到任何结果。例如

SELECT TOP (@BatchSize) C1 from LINKEDSRV.DB.DBO.Table22 
Run Code Online (Sandbox Code Playgroud)

如果我SET XACT_ABORT OFF. 那么 XACT_ABORT 对链接服务器有任何限制吗?

编辑- 进行了更多测试,看起来它也与行数有关

可能的回购

在服务器 A 上

use testdb
go
create table t1( c1 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 linked-server sql-server-2014

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

Service Pack 是否具有累积更新中的所有更改

我一直认为 CU 中的所有更改都会汇总到下一个服务包中。我最近在查看SQL 2016 SP2SQL 2016 CU15 for SP1 的变化

我很惊讶地看到 SP2 中没有提到 SP1CU15 中的知识库。我错过了什么?

sql-server sql-server-2016 patching

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

了解更新期间的非聚集索引锁定

设置脚本

CREATE TABLE t2 (   [col1] INT, [col2] INT  );

DECLARE @int INT;
SET @int = 1;

WHILE (@int <= 1000) 
BEGIN
    INSERT INTO t2 
        ([col1], [col2])
    VALUES (@int*2, @int*2);
    SET @int = @int + 1;
END
GO
create clustered index cl on t2(col1)
create  index ncl on t2(col2)
Run Code Online (Sandbox Code Playgroud)

我运行一个简单的更新并在读提交隔离级别保持事务打开。

begin tran
update t2 set [col2]=[col2]+1  where col1=6
Run Code Online (Sandbox Code Playgroud)

如果我在另一个会话中检查 sp_lock,我会得到以下结果

在此处输入图片说明

我想了解的是非聚集索引(indid 2)上的键锁。为什么非聚集索引上有两个键锁?

如果我检查第 248 页上的 dbcc 页面,我可以找到明显的一个 ((1bfceb831cd9)),它是记录 6 的条目的锁,该条目已更改为 7。下面 DBCC PAGE 的输出

在此处输入图片说明

我想了解的是另一个键锁(5ebca7ef4e2c)的目的是什么以及它的锁定是什么。

sql-server locking sql-server-2014

4
推荐指数
1
解决办法
1123
查看次数

哈希匹配运算符中的低基数估计

我正在尝试解决我们对 SQL Server 2008 R2 的报告查询之一的性能问题。

我已经包含了导致低估计的查询部分。这部分进一步与其他表连接。由于对这个的估计如此之低,进一步的连接最终会成为嵌套循环并导致查询永远运行。

select n.Transactionid
from nath n
WHERE StatusId = 3 and
Date IS NOT NULL and
NOT EXISTS (SELECT 1 FROM nath 
WHERE Transactionid= n.Transactionid
AND StatusId = 3
AND HistoryId < n.HistoryId)  
Run Code Online (Sandbox Code Playgroud)

预计计划

在此处输入图片说明

哈希匹配的估计值仅为 1.17,但实际上有 550K 条记录出现。统计信息已更新为完整扫描。

我在我们的 SQL Server 2014 实例之一上运行了完全相同的查询,它产生了更好的结果;哈希匹配运算符的估计值为 557K。然后我尝试使用跟踪标志 9481 来强制使用 2014 年的旧基数估计器,估计值又回到 1。所以我认为这个问题与旧的 CE 估计自连接有关。

我在 SQL Server 2008 R2 上尝试了跟踪标志 4199,但这没有帮助。

实际执行计划

我不希望实际表名可见,因此我创建了具有较少列和不同表名和列名的类似表。估计比上面提到的略有偏差,但更大的问题仍然存在。

带有 TF 9481 的 SQL Server 2014

(我没有 SQL Server 2008 R2 测试环境):

在此处输入图片说明

SQL …

performance sql-server cardinality-estimates query-performance

3
推荐指数
1
解决办法
1213
查看次数

即使存在覆盖索引,也会对分区表进行聚集索引扫描

我有一个基于 col1 int 分区的分区表。我还有一个覆盖索引,用于我尝试解决的查询。

https://www.brentozar.com/pastetheplan/?id=BkNrNdgHm

以上是计划

任其发展,SQL Server 决定对整个表进行聚集索引扫描,这显然很慢。如果我强制索引(如上面的计划),查询会快速运行。

SQL Server 使用什么魔术逻辑来确定覆盖索引没有用?我不确定 top/orderby 和 rowgoal 是否与它有关。

我的表结构是

Create table object2(col1 int, col3 datetime, col4 int, col5, col6 etc) clusterd on col1

nonclustered non aligned index is on col3,col4 (col1 is clustered so its included in nonclust)

SELECT top(?) Object1.Column1
    FROM Object2 Object1 WITH (NOLOCK,index(Column2))
    WHERE  Object1.Column3 >= ?
    AND Object1.Column4 IN (?)
    ORDER BY Object1.Column1
Run Code Online (Sandbox Code Playgroud)

编辑添加的回购

    CREATE PARTITION FUNCTION [PFtest](int) AS RANGE RIGHT FOR VALUES (100000, 200000, 300000, 400000, 500000, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization sql-server-2014 query-performance

3
推荐指数
1
解决办法
629
查看次数

并行运行 sys.dm_db_index_physical_stats

我试图让它们超过500 GB几张桌子碎片信息中,我使用...DETAILED的选项sys.dm_db_index_physical_stats。我在我们的预生产服务器上的生产数据库的还原副本上执行此操作,因此我不关心损害服务器上的任何性能。

我运行了它,看起来它正在串行运行,并且需要永远。有没有办法dm_db_index_physical_stats()并行运行?或者是否有任何其他设置干扰它?

我想DBCC TRACEON (8649)并且OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))在 SQL Server 2014 中不可用。

还试图DBCC SETCPUWEIGHT(1000);从保罗·怀特的博客在这里。该博客提到了并行抑制器,其中之一是系统表。被dm_db_index_physical_stats()认为是系统表吗?

performance index sql-server sql-server-2014

3
推荐指数
1
解决办法
232
查看次数