小编Beg*_*DBA的帖子

SQL Server 2008-R2 数据库上的大量短期阻塞

寻求专家就短期封锁提供建议,我们现在已经看到了近一周的时间。

DB 是 15 TB,而我们有很多阻塞的这个表 B - 几乎有 300 个是 2 TB。

在使用 sp_whoisactive 时,我看到查询在 3-4 秒的较短部分内被阻塞,有些在 9-10 秒内被阻塞,但由于这些查询几乎一整天都在连接超过 2-3 千个,这会导致应用程序中出现大量错误。

故障排除:

  • 更新了 NC 指数的统计数据,我们只有一个 NC 和一个 C 指数。
  • 通过哨兵检查我们可以看到,这些被阻塞的语句都是上面提到的那个表的插入语句。

以下是一些指标:

  1. 等待过去 3-4 小时的统计数据,直到阻塞为止
    • PAGELATCH_EX --> 51.1 % 总等待 730 513 153.5
    • PAGELATCH_SH --> 23 % 总等待 343 538 769.7
    • THREADPOOL --> 18 % 总等待时间 257 222 894.4
  2. 平均批次/秒:8612.6
  3. CPU 和内存 --> 远低于阈值,因为我们有 256 个逻辑处理器和 612 GB RAM
  4. 检查点页数/秒 --> 1706
  5. 懒惰写入 --> 0
  6. 日志刷新/秒 1844.4
  7. 事务/秒 9074

结果根据 david …

sql-server sql-server-2008-r2 blocking waits

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

节点故障转移后使 SQL 联机的时间更长

在为 SQL 服务器进行常规操作系统修补后,我们遇到了一个奇怪的问题。

根据最佳实践,我们在被动上应用补丁并进行节点故障转移以使当前被动、主动,反之亦然以完成修补。

通常节点故障转移是无缝的并且在一分钟内完成。但是最近我们遇到了一个问题,在节点故障转移后需要 4 分钟才能使 SQL 联机:

我正在检查日志和事件,但找不到原因:以下是迄今为止的调查结果:

注意:SQL 服务器在 VM 上运行

  1. SQL 服务器活动没有增加
  2. 数据库是数据库镜像的一部分
  3. 在此期间内运行时间更长的用户连接或用户查询不会增加
  4. 所有数据库的 VLF 低于 500
  5. 无 CPU/内存压力和 LPIM 已启用。
  6. 在故障转移期间似乎终止长时间运行的进程是 EXEC sp_server_diagnostics 20 running for last 86745234 secs

请协助我还应该检查什么才能找到根本原因?

编辑 - 我尝试分析集群日志,可以看到 sql 离线已启动,但我不确定它在内部花了至少 4 分钟的时间来实际关闭 sql 并将其恢复。4 分钟后,sql 错误日志将数据库的所有条目都调高了大约 10 秒。所以看起来 DB 可能没有参与这里来减慢进程。

编辑 - 当前检查时的一些 VLF 信息

在此处输入图片说明

sql-server clustering failover sql-server-2014

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

为混合 Always on Environment+ 实例创建 Windows 登录/用户,而无需 Always ON

我如何通过更改以下脚本来在启用/未启用 Always ON 的环境中运行。在 Kin 提供了一些非常有用的建议之后,下面似乎正在起作用。但是,当我需要跨 300-400 个 SQL 服务器进行部署时,此代码肯定不会处于最佳状态,而有些总是在其他服务器上没有。

请帮我修改/检查实例是否启用了AG并成功执行

更新根据@Kin 的要求

SET NOCOUNT ON   

 DECLARE @user_to_be_added sysname  
 SET @user_to_be_added = 'Domain\user'  

 DECLARE @sqltext nvarchar(max) = N''  

     if (select serverproperty('IsHadrEnabled')) = 0

  BEGIN

           -- change  to your user to be added .. make sure that the login is already existing

       SELECT  @sqltext += char(10)+ 'use '+quotename(name)+';'+char(10)+ 'CREATE USER '+quotename(@user_to_be_added)+' FOR LOGIN '+quotename(@user_to_be_added)

       FROM sys.databases where state_desc ='ONLINE' AND databaseproperty(name,'isReadOnly') = 0 

       SELECT  @sqltext

 END

    Else

 BEGIN


      SELECT  @sqltext …
Run Code Online (Sandbox Code Playgroud)

sql-server availability-groups sql-server-2014 sql-server-2016

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

使用哈希流不同运算符进行查询调整更新

需要一些帮助来理解UPDATE以下语句之一的缓慢:-

UPDATE TOP (100) xyz
SET xyz.flag = 1
OUTPUT inserted.Rcode, inserted.EDR, inserted.id, abc.EID,abc.CID,abc.ENID,abc.Cdate
FROM dbo.table1 xyz WITH (UPDLOCK, READPAST)
INNER JOIN dbo.table2 abc WITH (NOLOCK)
on xyz.id=abc.id
WHERE xyz.flag = 0
Run Code Online (Sandbox Code Playgroud)

表1有大约。50 万行,表 2 大约有。500 万行

慢计划

哈希匹配不同流运算符显示黄色警报,消息为:

操作员使用 Tempdb 溢出数据,以溢出级别 4 和 1 个溢出线程执行”

构建残差:

database.dbo.table2.id as abc.id = database.dbo.table2.id as abc.id

我截了屏。不幸的是,由于安全原因,我不能提供更多,甚至不能提供匿名计划。从我的工作站我无法访问互联网,所以我无法让计划浏览器在那里运行。

在此处输入图片说明

通常,对于较小的行子集,它在几秒钟内,就像我们刚刚匹配 10K 行或其他东西一样。但是随着数据量的增加,这似乎是一个临界点,应用程序无法承受 1 分钟的运行时间。从 SSMS 我得到 30 秒,但从应用程序我们有平均。约 50 秒 RCSI 处于测试阶段。

我的好计划没有显示 Hash Match Flow Distinct 运算符,如我的屏幕截图所示,而其余计划保持不变。好的一个在 3 秒左右完成。正如所见,该操作员花费了近 16 秒。我们可以通过适当的索引或查询重写来消除它吗? …

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

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

编写数据库用户级别权限的脚本

我试图搜索这个并且能够找到很少但找不到确切的方法来编写数据库的数据库级别权限。

我正在迁移这个数据库,我可以使用创建其登录名sp_help_revlogin,但不会复制用户权限。

我可以使用以下查询提取权限:

SELECT
   ISNULL(OBJECT_NAME(major_id),'') [Objects], USER_NAME(grantee_principal_id) as [UserName], permission_name as [PermissionName]
FROM
    sys.database_permissions p
WHERE grantee_principal_id>0
ORDER BY
    OBJECT_NAME(major_id), USER_NAME(grantee_principal_id), permission_name
Run Code Online (Sandbox Code Playgroud)

但是我需要像 rev login 这样的东西来生成一个脚本,你可以执行来获取权限映射。

我尝试过 DBAtools,但我无法使用,因为它失败并出现错误

无法找到类型 [DbaInstanceParameter]

我有 50 多个登录名和大约 20 个要复制的角色。

sql-server permissions scripting sql-server-2012

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

查询性能问题

使用 Demo from here重现我的问题,更改表结构如下,并将演示分区函数修改为 datetime

CREATE TABLE [dbo].[DemoPartitionedTable](
    [DemoID] [int] IDENTITY(1,1) NOT NULL,
    [SomeData] [sysname] NOT NULL,
    [CaptureDate] [datetime] NULL,
 CONSTRAINT [PK_DemoPartitionedTable] UNIQUE NONCLUSTERED 
(
    [DemoID] ASC,
    [CaptureDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
Run Code Online (Sandbox Code Playgroud)

用户运行如下查询(查询 1)

SELECT [DemoID], [SomeData], [CaptureDate] FROM    
[dbo].[DemoPartitionedTable] WHERE (1=1) and (1=1) and    
CONVERT(varchar(10),CaptureDate,112) between 20190912 and 20190912
Run Code Online (Sandbox Code Playgroud)

计划是https://www.brentozar.com/pastetheplan/?id=r1veZhovH

大约需要 4 小时才能返回 500 万行

如果我使用如下分区键来改进上面的代码(查询 2)

 SELECT [DemoID], [SomeData], [CaptureDate] FROM …
Run Code Online (Sandbox Code Playgroud)

performance sql-server partitioning sql-server-2012 query-performance performance-tuning

-1
推荐指数
1
解决办法
143
查看次数