标签: sql-server-2019

SQL Server 2019中的复制问题

我已经安装了 SQL Server 2019 RC1,但无法创建快照。当我运行快照代理时,我不断收到相同的消息:

2019-10-30 12:32:41.59 Microsoft (R) SQL Server Snapshot Agent
2019-10-30 12:32:41.59 [Assembly Version = 15.0.0.0, File Version = 15.0.1900.25]
2019-10-30 12:32:41.59 Copyright (c) 2016 Microsoft Corporation.
2019-10-30 12:32:41.59 The timestamps prepended to the output lines are expressed in terms of UTC time.
2019-10-30 12:32:41.59 User-specified agent parameter values:
2019-10-30 12:32:41.59 --------------------------------------
2019-10-30 12:32:41.59 -Publisher DB100
2019-10-30 12:32:41.59 -PublisherDB REF3_DB
2019-10-30 12:32:41.59 -Publication REF3_PDR4
2019-10-30 12:32:41.59 -Distributor DB100
2019-10-30 12:32:41.59 -DistributorSecurityMode 1
2019-10-30 12:32:41.59 -XJOBID 0xA694274CD89FAF418C8B059F22C01B85
2019-10-30 …
Run Code Online (Sandbox Code Playgroud)

replication sql-server sql-server-2019

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

不使用“持久化”列

我有一个具有以下结构的表:

ItemID           int
ItemType         char(1)
Language         char(2)
Localization     char(2)
Literal          nvarchar(4000)
Run Code Online (Sandbox Code Playgroud)

用于将特定的文本翻译ItemIDLiteral一个。该Literal列可能包含HTML标签。对于一组特定的查询,HTML需要删除这些标记,并且因为清理是使用 SQL CLR 对数千行完成的,所以我不想在读取时执行此类操作。

所以,我添加了一个像这样的持久列:

ALTER TABLE [dbo].[table]
ADD [LiteralSanitized] AS NULLIF(CAST(LTRIM(RTRIM([dbo].[fn_Utils_RemoveAllHtmlTags] ([Literal]))) AS NVARCHAR(4000)), '') PERSISTED;
Run Code Online (Sandbox Code Playgroud)

该表只有一个索引(主键),定义如下:

ItemID, ItemType, Language, Localization
Run Code Online (Sandbox Code Playgroud)

所以查询速度更快,但我看到这个表有一些额外的读取:

Scan count    - 2     vs 12,230 
Logical reads - 3,234 vs 43,472 
Run Code Online (Sandbox Code Playgroud)

这可能是正常的,因为现在我因为该列而读取了更多数据。所以,我添加了以下索引:

(ItemID ASC, ItemType ASC, Language ASC, Localization ASC) INCLUDE ([LiteralSanitized])
Run Code Online (Sandbox Code Playgroud)

但它不被引擎使用。所以,我尝试强制引擎使用它:

UPDATE #temp
SET [QuestionText] = PSGQ.[LiteralSanitized]
FROM #temp PQD                                            
INNER JOIN [dbo].[table_with_translations] …
Run Code Online (Sandbox Code Playgroud)

sql-server computed-column sql-server-2019

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

sql server是否锁定整个表并在表为堆时保持锁定状态?

无论 where 子句如何;

当表是堆(没有聚集索引)时,选择查询是否会使sql server锁定所有行,直到它完成读取所有行?

在具有聚集索引的表的情况下,sql server将逐一锁定行并在读取该行后立即释放它们?

有关此主题的任何参考链接都会非常有帮助。

sql-server heap sql-server-2019

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

为什么我不能对 dm_db_missing_index_details 进行脏读

我们的第 3 方生产系统之一经历了重大升级,通过 sp_whoisactive,我现在看到很多查询(1 个事务深度),这些查询阻止了我读取 dm_db_missing_index_details 的任何尝试。

我尝试过设置事务隔离级别并使用 NOLOCK,但 SQL 只是当着我的面笑。

汉娜·弗农 (Hannah Vernon) 能够在这里复制这种行为。

有谁知道如何解决这个问题?

上周我们的系统遇到了一些奇怪的阻塞,Redgate Intellisense 是阻塞链的一部分,是否有其他DMV也有同样的问题?

sql-server sql-server-2019

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

添加列时环境之间的性能差异

我们有 2 个完全相同的数据库环境。第二个环境包含生产数据库的副本并在发票表中托管大约 11M 条记录。此环境的目标是用于查看特定升级查询需要多长时间才能知道是否会出现任何停机(因为表在架构更改期间被锁定)

在第二个环境中执行 add 语句时

alter table Invoice add IsVerified bit not null default(0)
Run Code Online (Sandbox Code Playgroud)

查询立即退出,这很奇怪,因为里面有11M条记录。我预计至少会有一点延迟。即使是 select count(*) 也需要更长的时间。然而,在主生产数据库上,它需要更长的时间,超过 30 秒,因此我们必须将此查询计划到一个特殊的维护窗口中。执行查询时,没有任何东西阻止 SPID(使用 sp_who2 检查)

可能是什么原因,数据库的第二个副本似乎根本没有在 11M 记录数据库中添加列,而另一个主数据库无法及时完成(<30 秒)。也许一些特殊设置允许您添加默认值列而不需要写入所有记录?难道是因为我们的测试环境是Developer版而生产环境是Standard版?也许开发版中的某些特殊功能在 SQLStandard 中未激活?

select count(*) from Invoice //result: 11701200
SQL Server Execution Times:
   CPU time = 2375 ms,  elapsed time = 608 ms.
Run Code Online (Sandbox Code Playgroud)

要添加的脚本:

alter table Invoice add IsVerified bit not null default(0)
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2019

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

当辅助服务器因辅助服务器电源故障而错过 tlog 记录时,异步 AG 辅助辅助服务器如何与主服务器同步?

在不需要 WSFC 集群的 SQL AG(读取扩展)异步模式下,假设以下场景:

  1. 主节点将数据写入其事务日志并将该日志记录发送到辅助节点
  2. 假设在上述日志记录到达辅助节点之前辅助节点已断电

当辅助数据库启动时,它如何将其数据库与主数据库同步?这是自动还是手动过程?

sql-server availability-groups sql-server-2019

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

为什么查询大型数据库表时 sys.dm_os_buffer_descriptors 报告的内存与最大服务器内存不匹配?(表大小&gt;最大内存)

我的 SQL 2019 enterprise 系统内存为 180GB,最大 SQL Server 内存配置为 160GB。

有 3 个大型数据库,每个数据库大约 450GB。其他的是较小的数据库。

当我运行以下查询时:

SELECT
    databases.name AS database_name,
    COUNT(*) * 8 / 1024 AS mb_used
FROM sys.dm_os_buffer_descriptors
INNER JOIN sys.databases
ON databases.database_id = dm_os_buffer_descriptors.database_id
GROUP BY databases.name
ORDER BY COUNT(*) DESC;
Run Code Online (Sandbox Code Playgroud)

输出是:

Db1 83443
Db2 35665
Db3 20112
Db4 3559
Db5 2236
Tempdb 988
Msdb 670
Ssisdb 21
Master 2
Model 0
Run Code Online (Sandbox Code Playgroud)

以上合计为146696=143GB。

我并行安排了 3 个代理作业,1 个作业目标 1 db(针对 db1、db2 和 db3)。该作业对一些最大的数据库表一一执行 select *。我执行 SELECT * 的所有表的总大小约为 250GB。

我知道 …

sql-server sql-server-2019

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

SET STATISTICS IO ON 中的扫描计数是什么意思?

运行以下命令后,我正在查看查询的输出:SET STATISTICS IO ON

表1显示扫描计数为5,逻辑读取12197

表2显示扫描计数为0,逻辑读取80

文档说

扫描计数是在任何方向到达叶级别后开始的查找或扫描次数,以检索所有值以构建输出的最终数据集。

我正在寻找一个示例来了解此(扫描计数)对于上述输出的含义。我的困惑是,仅 5 次扫描如何实现 12197 的逻辑读取?

sql-server sql-server-2019

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

CHECKDB 期间出现错误 665

在我们的服务器上运行 CHECKDB 时,我们遇到了以下错误:

在文件“D:\MSSQL\Data\database1.mdf_MSSQL_DBCC34”中的偏移量 0x00021279006000 处写入时,操作系统向 SQL Server 返回错误 665(由于文件系统限制,请求的操作无法完成)。

正在运行的命令:

DBCC CHECKDB (database) WITH ALL_ERRORMSGS, NO_INFOMSGS, PHYSICAL_ONLY
Run Code Online (Sandbox Code Playgroud)

设置:

  • 生产环境中的5台服务器可用性组

    • 所有具有 NVMe 驱动器的物理服务器
    • SQL Server 2016
    • CHECKDB 在所有机器上运行
    • 仅在 AG 中的服务器 3 和 5(辅助服务器)上失败
      • 每台服务器 D 盘上有超过 700GB 的可用空间
    • 数据库大小为 2.2TB(1 个文件)
  • 测试环境中的2台服务器可用性组

    • 所有具有 SAN 驱动器的虚拟机
    • SQL Server 2019
    • CHECKDB 在所有机器上运行
    • 仅在 AG 中的服务器 1(主服务器)上失败
      • 服务器D盘有超过300GB的可用空间
    • 数据库为 2.6TB(2 个文件 - 2.3TB 和 280GB)

这一切都发生在同一个晚上。生产服务器上的数据库相同,但测试中的数据库不同。当然,我接到电话并开始调查此事。我决定在产品中的服务器 3 上再次运行 CHECKDB,以查找失败的数据库,并且成功且没有错误。此后我们再次收到错误,但它是随机的,这让我怀疑它是否是基于活动的。根据我们的监测,该活动相当正常。

根据本文 ( https://www.mssqltips.com/sqlservertip/3008/solving-sql-server-database-physical-file-fragmentation/ ),我们使用 CONTIG -A 查看了文件碎片。mdf 文件的碎片还不错(2 和 4 个碎片)。

根据这篇文章(https://learn.microsoft.com/en-US/troubleshoot/sql/database-engine/database-file-operations/1450-and-665-errors-running-dbcc-checkdb …

sql-server sql-server-2016 sql-server-2019

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

DELETE 查询后数据库大小增加

我在 SQL Server 2019 的一个表中有一个数据库,其中包含大量 varbinary(MAX) 重复记录。我们需要删除重复项,因此我运行了删除查询来删除重复项。数据库大小在删除语句之前没有保持不变,而是在查询完成后增加。我即将应用 DBCC SHRINKFILE(N'myDatabase', 0),但我真的很好奇为什么数据库大小会增加。附件是我的删除查询。

DELETE from Document WHERE DocumentId in 
(
    SELECT t.DocumentId
    FROM (
        SELECT s.*,
          ROW_NUMBER() OVER (PARTITION BY s.DocumentName, s.SubmitDateTime, s.DocumentType ORDER BY s.DocumentName, s.SubmitDateTime, s.DocumentType) AS [RowCount]
        FROM Document s
        LEFT OUTER JOIN Staging b ON s.DocumentId = b.DocumentId
        LEFT OUTER JOIN RejectTable r ON  s.DocumentId = r.DocID
        WHERE b.DocumentId IS NULL
          AND r.DocID IS NULL
          AND s.SubmitDateTime IS NOT NULL
          AND s.InsertDateTime IS NOT NULL
          AND s.DocumentName IS NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2019

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