标签: sql-server-2016

自动软 NUMA 导致奇数个内核

我在我们的一台 SQL Server 2016 生产服务器上运行 sp_blitz,结果之一是 CPU 的核心数为奇数。详细消息表明这是一个非常糟糕的 NUMA 配置。

如果 SQL Server 2016 检测到超过 8 个内核的物理处理器,它将使用自动软 NUMA。我们的特定服务器有两个插槽,每个插槽有 10 个 CPU。

SQL Server 错误日志中的启动消息表明:

自动软 NUMA 已启用,因为 SQL Server 检测到具有超过 8 个物理内核的硬件 NUMA 节点。

结果,SQL Server 创建了四个逻辑 NUMA 节点,每个节点有 5 个内核。

这是性能问题吗?

我们使用 MAXDOP = 4。

这里的并行性是一个问题吗?

sql-server sql-server-2016 numa

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

操作包含键/值对的列

我正在通过复制的 SQL Server 数据库访问和创建来自供应商的报告。他们做了一些我一直试图解决的绝对疯狂的事情,但这个问题占据了上风。

他们有一个包含许多标准列的表。但是这个表还有一个叫做“数据”的列。该列是传统的“文本”数据类型,它包含一个巨大的(数百个)键/值对列表。每对由 CRLF 分隔,键和值由等号分隔。例子:

select myTable.[data] from myTable where tblKey = 123
Run Code Online (Sandbox Code Playgroud)

结果:

Key 1=Value 1
Key 2=Value 2
Key 3=Value 3
...
Key 500=Value 500
Run Code Online (Sandbox Code Playgroud)

我正在尝试确定将该列分解为可用数据表的最有效方法。最终目标是能够以将表键以及指定键/值作为列/字段返回的方式查询表:

tblKey | [Key 1] | [Key 3] | [Key 243]
-------|---------|---------|-----------
 123     Value 1   Value 3   Value 243
 124     Value 1   Value 3   Value 243
 125     Value 1   Value 3   Value 243
Run Code Online (Sandbox Code Playgroud)

有没有办法将该列塑造成一个视图?我无法想象一个函数会特别有效,但我确信我可以使用 string_split 或类似的东西来解析事情。有没有人以前遇到过这种暴行并找到了一种将其操纵成可用数据的好方法?

编辑以添加dbfiddle示例数据。

数据是从供应商的来源复制的,因此我无法创建新表。我可以创建视图、过程和函数。这就是我正在寻找一种体面的方式来完成的建议。

join sql-server view sql-server-2016 enterprise-edition

7
推荐指数
2
解决办法
2844
查看次数

有没有一种可靠的方法来确定优化器生成查询计划需要多长时间?

我不确定我从哪里开始,但是有没有办法查看优化器为查询生成查询计划花费了多长时间?它是否存储在任何 DMV 或某个统计数据的一部分中?或者,如果我包含实时统计数据或实际执行计划,我可以以某种方式计算它吗?也许在查询存储中?

sql-server optimization statistics execution-plan sql-server-2016

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

何时重用非参数化、非平凡、即席查询计划

我目前正在调查一个应用程序,该应用程序似乎针对它正在查询的数据库生成 99% 的即席查询计划。我可以通过运行以下语句来检索查询计划缓存中的对象摘要来验证这一点:

抱歉无法在 SE 编辑器中输入代码,因此截图

查询 sys.dm_exec_cached_plans 的 select 语句

参考:计划缓存和优化临时工作负载(SQLSkills.com / K. Tripp) 稍作修改

上述查询的结果如下:

CacheType            Total Plans          Total MBs                               Avg Use Count Total MBs - USE Count 1                 Total Plans - USE Count 1
-------------------- -------------------- --------------------------------------- ------------- --------------------------------------- -------------------------
Adhoc                158997               5749.520042                             2             2936.355979                             126087
Prepared             1028                 97.875000                               695           46.187500                               576
Proc                 90                   69.523437                               39659         21.187500                               21
View                 522                  75.921875                               99            0.453125                                3
Rule                 4                    0.093750                                22            0.000000                                0
Trigger              1                    0.070312                                12            0.000000                                0    
Run Code Online (Sandbox Code Playgroud)

在计划缓存中的 158'997 个即席查询中,126'087 个查询只执行了一次。 …

sql-server execution-plan sql-server-2016

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

在回滚的事务中仍会发生哪些事件?

当它们所属的事务被回滚时,所有​​数据修改都被撤消是真的吗?

例如,如果一个游标只执行了 100 次在每次迭代中更新表的存储过程,所有这些更新都会回滚吗?

DDL 语句会回滚吗?...例如 DROP TABLE 或 CREATE VIEW?DROP DATABASE 呢?

我知道某些语句仍然执行,尽管像 PRINT“MESSAGE”。

我只是想了解仍然会发生哪些类型的事件。

sql-server dml transaction ddl sql-server-2016

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

有没有一种简单的方法可以从另一个会话的临时表中进行选择?

有没有一种简单的方法可以从另一个会话的临时表中选择数据?我需要专门这样做来调试一个我在其他方面的可见性有限的问题。例如,如果我有权访问 TEMPDB,是否可以访问表对象本身?

我看到 Paul White 的这篇文章介绍了一种方法,但它比我希望的要复杂得多:查看另一个会话的临时表

我无法将代码切换为使用全局临时表进行调试。

sql-server temporary-tables sql-server-2016

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

更改跟踪导致闩锁争用

我在 Windows Server 2012 R2 Standard 6.3 上使用 Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64) Jun 15 2019 23:15:58 版权所有 (c) Microsoft Corporation 标准版(64 位) (内部版本 9600:)

数据库大小约为 870 GB。这是 SQL 标准,我在服务器上有 128 GB 的 RAM。数据库位于 SSD 驱动器上。数据文件与日志文件位于不同的驱动器上,Tempdb 也有自己的 SSD 驱动器。服务器平均获得大约 1200 个查询/秒,它可以高达 2000 个查询/秒。重新编译保持较低,每秒只有 1 到 8 次。页面预期寿命不错,平均 61 分钟。

服务器有 6 个物理核心 + 超线程。

我们在数千个设备连接并尝试将更改与跟踪键同步的系统上大量使用 SQL Server 的更改跟踪。

它通常运行良好,但有时,有一天或另一天,服务器的闩锁会猛增,从 0 毫秒到平均 60677 毫秒。

SQL 锁存器

当我检查正在运行哪些查询时,我只能看到同步查询,全部被阻止,带有“PAGELATCH_UP”,全部试图访问更改跟踪表,被阻止的 300 多个查询。

我有几个问题:

  • SQL Server 是否在查找更改跟踪更改时锁定整个表?
  • 使用 SQL Entreprise 会得到更好的结果还是不会改变任何东西?
  • 知道为什么更改跟踪在大多数情况下运行良好,但每周都没有明显原因崩溃吗?

这些是我的更改跟踪表大小。我的查询阻塞的表是前三个表,只有几 …

change-tracking sql-server-2016

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

如果选择语句包含在 BEGIN TRAN ... COMMIT 中,是否有任何副作用?

我正在处理一个相当古老的 .NET 项目,并引入了一些新功能(在顶部),这些功能产生了以下副作用:所有生成的 SELECT(或组)都包含在BEGIN TRAN ... COMMIT语句中。

这听起来很愚蠢,但要摆脱它需要进行大量更改,而我负担不起。我的假设是这基本上意味着每组 SELECT 的小开销(应用程序和 SQL Server 之间的 BEGIN TRAN 和 COMMIT)。

我想知道是否还有更多内容(额外锁定?)。

问题:如果选择语句包含在 BEGIN TRAN ... COMMIT 中,是否有任何副作用?

sql-server transaction select sql-server-2016

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

ntext 列中 REPLACE() 的替代解决方案

概述

\n

我有一个图片数据库,其中记录了用相机拍摄的照片的信息。该数据库包含一个有 256 列的表pictures,其中包含有关已拍摄照片的信息。

\n

一列的Comments格式为ntext并包含 CR/LF。
\n还有另外 21 列已配置为ntext.

\n

我使用 SSMS 中的函数将数据库中的数据提取到平面文件中Tasks | Export Data...。然后,导出的数据由外部合作伙伴传输到将在不久的将来使用的新系统。导出文件 (CSV) 包含约 256 列,其中 21 列可能包含 CR/LF。

\n

问题

\n

字段/列包含大量影响数据分析的CommentsCR/LF (SQL: CHAR(13), )。CHAR(10)

\n

我尝试使用REPLACE(expression, value, value)来搜索 CR/LF 并将其替换为 ,@@并且正在考虑Export Data在 SSMS 中使用导出期间实现这一点。

\n

然而,该REPLACE()函数返回一个

\n
\n

消息 8116,级别 16,状态 1,第 4 行
\n参数数据类型 ntext 对于替换函数的参数 1 …

sql-server regular-expression type-conversion sql-server-2014 sql-server-2016

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

分区表和性能上的触发器

我不确定我发现的是否是一个错误,但它看起来确实是这样。我找不到太多有关它的信息,所以我决定把它放在这里。

因此,简而言之,在访问内部表(inserteddeleted分区表上定义的触发器中的

为了测试这个问题,我创建了一些简单的表,它们完全相同,但一个是分区的,另一个不是:

create table [dbo].[Test1](
    [part_id] [int] not null,
    [id] [int] not null,
    [cost] [float] null,
    constraint [pk__Test1] primary key clustered ([part_id] asc, [id] asc) on ps_part(part_id)
);

create table [dbo].[Test2](
    [part_id] [int] not null,
    [id] [int] not null,
    [cost] [float] null,
    constraint [pk__Test1] primary key clustered ([part_id] asc, [id] asc)
);
Run Code Online (Sandbox Code Playgroud)

然后我用一些数据填充了表格。我现在没有数据生成脚本,我只是使用了一些本地数据,但是这些表中有大约 473 个不同的分区和大约 383M 行。

然后我刚刚测试了这些表的更新速度,使用非常简单的查询,例如

update dbo.Test1 set cost = cost + 0.1 where part_id = ??;
update dbo.Test1 set cost = …
Run Code Online (Sandbox Code Playgroud)

trigger performance sql-server partitioning sql-server-2016

7
推荐指数
2
解决办法
1052
查看次数