小编Bre*_*rey的帖子

如果禁用内存中的锁定页面选项,大内存服务器中会出现非生成调度程序错误

我们在 SQL Server VM 上看到许多非生成调度程序错误。阅读 Microsoft Docs 上的此链接,建议我们启用内存中的锁定页面。

我对内存中的锁定页面没有太多经验,并且我读过很多博客文章,其中对打开它表示谨慎。

服务器详细信息

  • Windows 服务器 2016
  • SQL Server 2017 CU27
  • 504 GB 总内存
  • 64核
  • 43GB 页面文件
  • 最大服务器内存设置为 460 GB
  • 最大DOP 16

我正在向具有内存锁定页面经验的人寻求建议,特别是在具有大内存的虚拟机上。或者是否还有其他我没有想到的选择?

sql-server wait-types sql-server-2017

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

选择包含 NULL 的前 x 行之后的所有行

我有桌子src。在此表中,每个产品-国家/地区组合可能包含NULLCountry第一行的列中x

如何为每个产品-国家/地区组合提供行,仅包含“国家/地区”列中包含的SELECT第一行之后的行?对于后面的任何行也很重要,即使它们确实包含在“国家/地区”列中,只要在其之前至少有一行具有真实值即可。xNULLSELECTNULL

预期输出

例如。

  1. 对于产品 A,我想要ID 为 3 和 4SELECT的行,而不是 ID 1 和 2 的行。
  2. 对于产品 B,我想要ID 为 6 和 7SELECT的行,而不是 ID 5 的行。
ID 产品 国家 时间戳
3 A 2022-01-23 14:29:06.830
4 A 无效的 2022-01-24 14:29:06.830
6 CH 2022-01-23 14:29:06.830
7 无效的 2022-01-24 14:29:06.830

示例表和数据

create table dbo.src
(
    ID int not null
    ,Product varchar(2) not …
Run Code Online (Sandbox Code Playgroud)

sql-server query t-sql

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

服务器重新启动后查询存储强制计划是否仍然存在?

想问一下,因为找不到这个信息。

服务器重新启动后查询存储强制计划是否仍然存在?

在哪些情况下,通过查询存储强制执行的计划不会保持有效?

sql-server sql-server-2016 query-store

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

捕捉并理解事务回滚

由于应用程序的数据一致性问题(零星数据丢失),我必须深入研究事务处理。我创建了一个扩展事件会话:

CREATE EVENT SESSION [system_rollback_error] ON SERVER 
ADD EVENT sqlserver.error_reported(
    ACTION(
        package0.event_sequence,
        sqlserver.client_app_name,
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.server_principal_name,
        sqlserver.session_id,
        sqlserver.session_nt_username,
        sqlserver.sql_text,
        sqlserver.transaction_id,
        sqlserver.transaction_sequence
    )
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))
        AND [severity]>(10))),
ADD EVENT sqlserver.sql_transaction(
    ACTION(
        package0.event_sequence,
        sqlserver.client_app_name,
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.server_principal_name,
        sqlserver.session_id,
        sqlserver.session_nt_username,
        sqlserver.sql_text,
        sqlserver.transaction_id,
        sqlserver.transaction_sequence
    )
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))
        AND [transaction_state]='Rollback'
        AND [transaction_type]='System'))

ADD TARGET package0.event_file(
    SET filename=N'system_rollback_error',
        max_file_size=(100)
    )
    WITH (
        MAX_MEMORY=4096 KB,
        EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY=30 SECONDS,
        MAX_EVENT_SIZE=0 KB,
        MEMORY_PARTITION_MODE=NONE,
        TRACK_CAUSALITY=OFF,
        STARTUP_STATE=OFF
    )
GO 
Run Code Online (Sandbox Code Playgroud)

现在,我收到此 ext-event 会话中显示的大量 DUI 语句,所有这些语句都处于自动提交模式,但没有任何错误消息。没有关键违规,没有错误的语法或让我知道为什么事务被回滚的东西。我已经使用检查了事务日志

select * from sys.fn_dblog(NULL,NULL) where …
Run Code Online (Sandbox Code Playgroud)

sql-server

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

如何提高少量更新行的更新速度?

我正在使用 SQL Server 2019,并面临一个问题,即在进行更新时,只需要 20 秒即可更新 162 行。

Update FT SET
    ft.ValueName=avo.name
FROM #package FT 
inner join parts.Nop_PackageAttribute PA with(nolock)
    on PA.PackageID=ft.PackageID
        and PA.[Key]=FT.ZfeatureId 
inner join Nop_AcceptedValuesOption AVO with(nolock)
    ON convert(varchar(20),AVO.AcceptedValuesOptionID)=PA.Value 
where FT.AcceptedValueID is not null
Run Code Online (Sandbox Code Playgroud)

脚本示例

 create table #package
 (
 id int PRIMARY KEY IDENTITY(1,1),
 ZfeatureId INT NULL,
 AcceptedValueID INT NULL,
 PackageID INT NULL,
 ValueName NVARCHAR(2000) default ''
 )
Run Code Online (Sandbox Code Playgroud)

我在 #package 表上的索引

 create nonclustered index IDX_PackageID on #package(PackageID) include (ZfeatureId,AcceptedValueID , ValueName)
 create index acceptedvaluesidpackage_idx on #package(AcceptedValueID) …
Run Code Online (Sandbox Code Playgroud)

index sql-server sql-server-2019 query-performance

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

有没有办法为 UNIQUE NONCLUSTERED 索引添加 INCLUDE?

我们有一个包含 4 列的表(示例):

create TABLE [dbo].[myTable]
(
        [Id] BIGINT NOT NULL,
        [Id2] SMALLINT NOT NULL,
        [Id3] SMALLINT NOT NULL,
        [IdUnique] UNIQUEIDENTIFIER NOT NULL,
        [CreateDate] DATETIME NOT NULL,
        CONSTRAINT [PK_MyTable_Id_Id2_Id3] PRIMARY KEY CLUSTERED ([Id], [Id2], [Id3]),
        CONSTRAINT [UQ_MyTable_IdUnique] UNIQUE NONCLUSTERED ([IdUnique] ASC )  
)
Run Code Online (Sandbox Code Playgroud)

这个想法是在 WHERE 中使用 IdUnique 来检索 ID、ID2 和 ID3:

在此输入图像描述

但显然我们正在进行键查找。

如何在唯一非聚集索引上包含包含列?

我找不到与此相关的任何内容。

index sql-server constraint sql-server-2014

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

mslid 上的非聚集索引查找速度很慢

我在 SQL Server 中遇到一个问题,其中非聚集索引查找的性能很差。

下面是实际的执行计划 https://www.brentozar.com/pastetheplan/?id=Sk3-4JGAK

我怎样才能提高绩效?

下面是表定义

 CREATE TABLE [Parts].[ManufacturingData](
     [LeadFinishId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
     [PartID] [int] NOT NULL,
     [LeadFinishMaterial] [varchar](50) NULL,
     [CreatedDate] [datetime] NULL,
     [CreatedBy] [int] NULL,
     [ModifiedDate] [datetime] NULL,
     [Modifiedby] [int] NULL,
     [DeletedDate] [datetime] NULL,
     [DeletedBy] [int] NULL,
     [Revision_Id] [int] NULL,
     [BaseMaterialID] [int] NULL,
     [MSLID] [int] NULL,
     [MSLSource_Revision_id] [int] NULL,
     [MaximumReflowTemperatureID] [int] NULL,
     [ReflowTemperatureSource_Revision_Id] [int] NULL,
     [MaximumWaveTemperatureID] [int] NULL,
     [WaveTemperatureSource_Revision_ID] [int] NULL,
     [ReflowSolderTimeID] [int] NULL,
     [WaveSolderTimeID] [int] NULL,
     [NumberOfReflowCycleID] [int] NULL,
     [LeadFinishPlatingID] [int] NULL, …
Run Code Online (Sandbox Code Playgroud)

sql-server constraint stored-procedures execution-plan sql-server-2016

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

如何更改 SQL Server 中新数据库的默认数据库所有者?

我有理由更改我的计算机名称(it\xe2\x80\x99s 在虚拟机中运行)。我有一个现有的 SQLExpress 实例,它是在重命名之前安装的。

\n

有些功能会失败,因为新数据库仍然由旧所有者创建。更具体地说,当我尝试创建新的数据库图表时,出现以下错误。

\n
\n

无法获取有关 Windows NT 组/用户 \'OLDNAME\\user\' 的信息,错误代码 0x534。(微软 SQL Server,错误:15404)。

\n
\n

我使用以下说明来重命名服务器:

\n
sp_dropserver \'OLDNAME\\SQLEXPRESS\';\nGO\nsp_addserver \'NEWNAME\\SQLEXPRESS\',\'local\';\nGO\n--  Restart Server\nSELECT @@SERVERNAME;    --  NEWNAME\\SQLEXPRESS\n
Run Code Online (Sandbox Code Playgroud)\n

但是,这并不影响新数据库的默认所有者。它们仍在与所有者一起创建OLDNAME\\user,但所有者已不存在。

\n

我知道如何在创建后更改现有数据库的所有者。但是,如何才能让新数据库拥有正确的所有者呢?

\n

sql-server logins owner

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

SQL Server 2016 的内存利用率

我在 Windows Server 上运行 SQL Server 2016 企业版,内存为 128 GB。在安装过程中,我为 SQL 服务器分配了 124 GB,因为该服务器仅专用于 SQL,其余的留给操作系统。

现在,当 DML/DDL 查询运行或任何维护计划运行时,每个任务管理器的内存消耗飙升至 97%。但。PLE 保持良好状态(即 > 300 秒)并且未观察到性能问题。一旦作业和查询完成,SQL 在相当长一段时间内不会释放内存,我必须进行内存上限或等待一整天才能释放内存。

除了内存上限之外,还有什么方法可以让 SQL Server 释放内存以及为什么 SQL 无法在所有作业完成后立即释放内存。

sql-server memory sql-server-2016 enterprise-edition performance-tuning

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

SqlServer 2008 R2升级到2017后出现Raiserror错误

请提供建议并分享您的解决方案。

2008年R2

DECLARE @ErrMsg varchar (25) 
SET @ErrMsg = 'Test Raiserror in 2008 R2'
RAISERROR 50002 @ErrMsg
Run Code Online (Sandbox Code Playgroud)

上述语句产生以下输出。

消息 50002,级别 16,状态 1,第 4 行 2008 R2 测试 Raiseerror 完成时间:2022-03-12T20:12:20.1296499+03:00

2017年

DECLARE @ErrMsg varchar (25) 
SET @ErrMsg = 'Test Raiserror in 2017'
RAISERROR 50002 @ErrMsg
Run Code Online (Sandbox Code Playgroud)

上述语句产生以下输出。

消息 102,级别 15,状态 1,第 4 行“50002”附近的语法不正确。完成时间:2022-03-12T20:13:24.4256066+03:00

sql-server

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