标签: sql-server

我们生产 SQL Server 上的主要性能问题,我将如何解决这个问题?

这个问题基本上是这个问题的后续问题:
SQL Server 2016 的奇怪的性能问题

我们现在使用这个系统提高了效率。虽然自从我上一篇文章以来,另一个应用程序数据库被添加到这个 SQL Server 中。

这些是系统统计信息:

  • 128 GB RAM(SQL Server 的最大内存为 110 GB)
  • 4 核 @2.6 GHz
  • 10 GBit 网络连接
  • 所有存储均基于 SSD
  • 程序文件、日志文件、数据库文件和 tempdb 位于服务器的不同分区上
  • 视窗服务器 2012 R2
  • VMware 版本 HPE-ESXi-6.0.0-Update3-iso-600.9.7.0.17
  • VMware Tools 版本 10.0.9,内部版本 3917699
  • Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 2016 年 10 月 28 日 18:17:30 版权所有 (c) Windows Server 2012 R2 Standard 6.3(内部版本 9600)上的 Microsoft Corporation 标准版(64 位): (管理程序)

在此处输入图片说明

我们的系统现在存在重大的性能问题。非常高的 CPU 使用率和线程数: 在此处输入图片说明

等待活动监视器的统计数据(我知道它不是很可靠)

在此处输入图片说明

sp_blitzfirst 的结果:

在此处输入图片说明

sp_configure 的结果:

在此处输入图片说明

高级服务器设置(不幸的是只有德语)

在此处输入图片说明

MAXDOP …

performance sql-server vmware cpu

11
推荐指数
2
解决办法
5438
查看次数

谁在使用我的工作线程?SQL Server 2014 - HADR

我们最近在 SQL Server 2014 HADR 环境中遇到了一个问题,其中一台服务器用完了工作线程。

我们收到消息:

AlwaysOn 可用性组的线程池无法启动新的工作线程,因为没有足够的可用工作线程。

启动时的错误信息

我已经打开了另一个问题,以获得(我认为)应该帮助我分析问题的声明(是否可以查看哪个 SPID 使用哪个调度程序(工作线程)?)。虽然我现在有查询来查找正在使用系统的线程,但我不明白为什么该服务器用完了工作线程。

我们的环境如下:

  • 4 Windows Server 2012 R2
  • SQL Server 2014 企业版
  • 24 个处理器 --> 832 个工作线程
  • 256 GB 内存
  • 12 个可用性组(总体)
  • 642个数据库(总体)

因此,出现问题的服务器具有以下配置:

  • 5 个可用性组(3 个主要 / 2 个辅助)
  • 325 个数据库(127 个主要 / 198 个辅助)
  • MAXDOP = 8
  • Cost Threshold for Parallelism = 50
  • 电源计划设置为“高性能”

为了“解决”该问题,我们手动将一个可用性组故障转移到辅助服务器。该服务器的配置现在是:

  • 5 个可用性组(2 个主要 / 3 个辅助)
  • 325 个数据库(77 个主要 / 248 个辅助)

我正在使用以下语句监视可用线程:

declare @max int
select @max = max_workers_count from …
Run Code Online (Sandbox Code Playgroud)

sql-server availability-groups sql-server-2014

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

用户 `dbo` 和存储在 sys.databases 中的数据库的所有者有什么区别

我们最近遇到了一个问题,其中dbo数据库中的用户具有sid与owner_sidin不匹配的sys.databases。我了解数据库的所有者与角色的成员有何不同,db_owner但我一直认为用户dbo是数据库的实际所有者。不是这样吗?如果是的话有没有之间的任何真正的差异dbo,什么是中sys.databases?

security sql-server

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

bcp 命令 '?' 附近的语法不正确。字符实际上是:“ä”

我 在 Ubuntu (Linux) 上安装了mssql-server和mssql-tools。当我尝试使用以下命令行使用bcp命令导出数据时:

bcp DBname.dbo.Täble_Name out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

SQLState = 37000,NativeError = 102
错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]'?' 附近的语法不正确。

该?是ä。

如果我Täble_Name用方括号括起来:

 bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~
Run Code Online (Sandbox Code Playgroud)

我在对象名称上收到此错误:

SQLState = S0002,NativeError = 208
错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无效的对象名称“DBname.dbo.Täble_Name”。

我进一步添加了单引号''以及-q选项(启用带引号的标识符):

bcp 'DBname.dbo.[Täble_Name]' out …
Run Code Online (Sandbox Code Playgroud)

sql-server linux ubuntu bcp sql-server-2017

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

什么函数在带有 SQL Server 的动态 sql 中引用标识符?

什么是用于动态 sql 生成的安全引用标识符的 SQL Server 方法。

我如何确保为动态生成的语句提供动态生成的列名,该列本身不是 SQL 注入攻击。

假设我有一个 SQL 语句,

SELECT [$col] FROM table;
Run Code Online (Sandbox Code Playgroud)

本质上与

'SELECT [' + $col + '] FROM table;'
Run Code Online (Sandbox Code Playgroud)

什么可以阻止注入攻击

$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";
Run Code Online (Sandbox Code Playgroud)

导致

SELECT [$col] FROM table;
Run Code Online (Sandbox Code Playgroud)

security sql-server sql-injection

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

从带有聚集索引的 SQL Server 表中删除数据期间 B-Tree 是否重新平衡?

我在 SQL Server 数据库中有一个表,主键上有一个聚集索引。该表有 100 万行。如果我从表中删除 10K 行,在执行删除操作期间索引会被重组吗?

删除操作是存储过程的一部分。一次,可以有多个客户端执行存储过程,但是每次运行都会删除它自己的一组行(由主键唯一标识)。当多个客户端执行该过程时,我会阻塞键锁(U 型)。阻塞锁属于同一个表中的一行,它不属于任何并发运行的事务。不应该有任何阻塞,因为每次运行都试图删除它自己的一组行。锁定升级不会发生,因为它已关闭。

我怀疑,删除操作一定会导致索引重新平衡,因此在重组过程中,它可以对表的任何行进行键锁定。

我真的很感激对此的任何意见。

index sql-server optimization

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

使用 READ UNCOMMITTED 隔离级别的最佳情况

众所周知,READ UNCOMMITTED 是最低的隔离级别,在该级别中可能会产生脏读和幻读之类的事情。何时是使用此隔离级别的最佳时间,可能出于什么原因使用它?

其实我之前看过答案,但是因为例子不够,所以没能完全理解。

sql-server deadlock concurrency isolation-level

11
推荐指数
3
解决办法
5329
查看次数

N'?c' 使用 Latin1_General_CI_AS 排序规则认为 N'C' 的重复键

我有一个带有唯一键的表,其中包含一NVARCHAR(50)列(正确与否,但在那里)。因此,当尝试插入?c或C(与插入顺序无关)时,由于整理问题,它会在第二次插入时中断。这是错误:

(受影响的 1 行)消息 2601,级别 14,状态 1,第 16 行无法在具有唯一索引“IX_TestT”的对象“dbo.testT”中插入重复的关键行。重复的键值为 (C)。

选择退货:

在此处输入图片说明

数据库默认排序规则是Latin1_General_CI_AS. 花了一些时间寻找如何解决它,而不会对现有结构进行太多更改,但找不到开始工作的方法。尝试了不同的排序规则和组合,一切都失败了。阅读(这里和这里)关于字符扩展等,仍然卡住了。这是我用来复制问题的示例代码,请随时修改并推荐任何有助于解决此问题的内容。

CREATE TABLE testT (
    [Default_Collation]     [NVARCHAR] (50) COLLATE DATABASE_DEFAULT,
    [Latin1_General_CI_AS]  [NVARCHAR] (50) COLLATE Latin1_General_CI_AS,
    [Latin1_General_CI_AI]  [NVARCHAR] (50) COLLATE Latin1_General_CI_AI,
    [SQL_Collation]         [NVARCHAR] (50) COLLATE SQL_Latin1_General_CP1_CI_AS);
CREATE UNIQUE CLUSTERED INDEX [IX_TestT] ON [dbo].[testT] ([Default_Collation])
ON [PRIMARY]
GO

INSERT INTO testT
SELECT  N'?c',  --COLLATE Latin1_General_CI_AS
        N'?c',  --COLLATE Latin1_General_CI_AS
        N'?c',  --COLLATE Latin1_General_CI_AS
        N'?c'   --COLLATE Latin1_General_CI_AS

INSERT INTO testT
SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server collation t-sql sql-server-2014 unique-constraint

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

如何选择组中每列的最后一组非 NULL 值?

我正在使用 SQL Server 2016 并且我使用的数据具有以下形式。

CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1));

INSERT INTO #tab VALUES 
    ('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL),
    ('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL);

SELECT *
FROM    #tab;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我想获取列上的最后一个非空值,val1并按val2分组cat和排序t。我寻求的结果是

cat  val1 val2
A    1    P
B    10   C
Run Code Online (Sandbox Code Playgroud)

我最接近的是使用LAST_VALUE而忽略ORDER BY哪个不起作用,因为我需要有序的最后一个非空值。

SELECT DISTINCT 
        cat, 
        LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1,
        LAST_VALUE(val2) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val2
FROM    #tab
Run Code Online (Sandbox Code Playgroud)
cat  val1 val2 …
Run Code Online (Sandbox Code Playgroud)

sql-server window-functions

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

具有手动播种的分布式可用性组

我正在寻找有关如何使用手动播种设置分布式可用性组的分步演练。我可以让自动播种工作,但是当我尝试手动播种时,我无法将辅助数据库放入转发器上的 AG。

如果我在尝试将数据库添加到常规 AG 之前将分布式 AG 添加到辅助服务器,则会收到以下消息:

Msg 41190, Level 16, State 7, Line 22
Availability group 'MYDB' failed to process add-database command.  The local availability replica is not in a state that could process the command.  Verify that the availability group is online and that the local availability replica is the primary replica, then retry the command. 
Run Code Online (Sandbox Code Playgroud)

如果我尝试先添加数据库而不加入辅助数据库上的分布式 AG,我会收到以下消息,因为它认为它应该是主数据库:

Msg 927, Level 14, State 2, Line 22
Database 'MYDB' cannot be opened. It is in the middle of a …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2017 distributed-availability-groups

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