标签: sql-server

索引重建期间的统计信息更新

我手头有一项任务是移动重建一个大表,以将 LOB 页面移动到 SQL Server 2017 Enterprise Edition 上的不同文件组。

我正在概念验证环境中测试脚本,我可以看到总共大约CREATE INDEX .. DROP_EXISTING=ON需要 6 小时。

CREATE UNIQUE CLUSTERED INDEX [PK_TABLE1]
ON [dbo].[TABLE1] ([Id] ASC)
 WITH (DROP_EXISTING = ON , FILLFACTOR = 100, PAD_INDEX = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, IGNORE_DUP_KEY = OFF, DATA_COMPRESSION = NONE, STATISTICS_NORECOMPUTE = OFF, ONLINE = ON, MAXDOP=2) 
ON PS_MOVE_HELPER_D59E24BC73414AA8A5FB2E5D8F93C3D8([Id] );

CREATE UNIQUE CLUSTERED INDEX [PK_TABLE1]
ON [dbo].[TABLE1] ([Id] ASC)
 WITH (DROP_EXISTING = ON , FILLFACTOR = 100, PAD_INDEX = OFF, ALLOW_ROW_LOCKS …
Run Code Online (Sandbox Code Playgroud)

sql-server filegroups index-maintenance sql-server-2017

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

我可以同时将多个节点加入 SQL Server 故障转移群集吗?

我正在设置三节点 SQL Server FCI。我已经创建了 WSFC 并在节点 1 上设置了 SQL Server 故障转移群集。现在,我需要将节点 2 和节点 3 添加到故障转移集群。我的问题是,我可以同时将两个节点添加到集群中还是需要一次添加一个节点?

对此的任何见解或建议将不胜感激。提前致谢!

sql-server clustering

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

我应该使用哪个 SQL Server 管理器:C:\Windows\System32 或 C:\Windows\SysWOW64?

我正在使用 SQL Server,并且需要访问 SQL Server 管理器。但是,我注意到有两种不同的路径可以访问它:C:\Windows\System32\SQLServerManager16.mscC:\Windows\SysWOW64\SQLServerManager16.msc。我不确定该使用哪一个。谁能解释这两条路径之间的区别以及推荐使用哪一条?

sql-server

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

SQL Server 2012标准版重建索引

我们使用SQL Server 2012标准版。有没有办法重建索引,尽量不造成数据表锁定,减少对性能的影响?

当我们重建索引时,会导致程序访问数据库超时。我希望避免或减少性能影响。

sql-server sql-server-2012 index-maintenance

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

ms sql 中 IF NOT EXISTS 查询的问题

我想编写查询脚本来验证是否没有现有列测试以在检查条件后添加它。但这两种方式都行不通。

方式一:

IF [dbo].[TEST].TEST NOT EXISTS
BEGIN
 ALTER TABLE [dbo].[TEST] ADD TEST INT;
Run Code Online (Sandbox Code Playgroud)

方式二:

ALTER TABLE [dbo].[TEST] ADD TEST INT
where NOT EXISTS in ([dbo].[TEST].TEST);
Run Code Online (Sandbox Code Playgroud)

sql-server if-not-exists

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

显式定义列排序规则,即使它是数据库默认排序规则

如果排序规则是数据库默认值,SQL Server 似乎会不遗余力地删除COLLATE对列的限制。nvarchar我的数据库默认是SQL_Latin1_General_CP1_CI_AS. 如果我这样创建一个表:

CREATE TABLE [dbo].[UserActive](
    [Id] [uniqueidentifier] NOT NULL,
    [DateCreated] [datetimeoffset](7) NOT NULL,
    [Username] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Password] [nvarchar](max) NULL,
    [Email] [nvarchar](254) NOT NULL,
 CONSTRAINT [PK_UserActive] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

...然后要求 SQL Server Management Studio 将表编写为CREATE语句,我得到以下结果:

CREATE TABLE [dbo].[UserActive]( …
Run Code Online (Sandbox Code Playgroud)

sql-server collation

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

如何使用 SQL Server 2022 在节点之间复制作业

我创建了一个包含的可用性组,但我不知道为什么作业在节点之间不同步。可能是什么问题呢?它不应该自动完成吗?


为了响应这个答案,我执行了以下操作:

我已连接到我们现在用作主服务器 (xxxxx) 的服务器,并且我在那里创建了一个测试作业。

数据库的同步工作正常,但不适用于登录和作业。

sql-server availability-groups contained-database sql-server-2022

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

如何优化存储过程并减少表扫描?

我有一个存储过程,可以识别上次 SSIS 作业运行中候选人信息的任何更改。然后它继续将更改保存在同步表中。

\n
CREATE PROCEDURE [dbo].[IdentifyCandidateChanges]\xc2\xa0\xc2\xa0\n(\xc2\xa0\xc2\xa0\n@MoreToProcess BIT = 0 OUTPUT\xc2\xa0\xc2\xa0\n)\xc2\xa0\xc2\xa0\nAS\xc2\xa0\xc2\xa0\n\nSET NOCOUNT ON\xc2\xa0\xc2\xa0\n\nDECLARE @BatchSize INT\xc2\xa0\xc2\xa0\n\nSELECT\xc2\xa0\xc2\xa0\n@MoreToProcess = 0\xc2\xa0\xc2\xa0\n, @BatchSize = 200000\xc2\xa0\xc2\xa0\n\nDECLARE @Changes TABLE\xc2\xa0\xc2\xa0\n(\xc2\xa0\xc2\xa0\n  CandidateNo VARCHAR(10) NOT NULL\xc2\xa0\xc2\xa0\n, CentreNo CHAR(5) NOT NULL\xc2\xa0\xc2\xa0\n, CandidateModifiedDate DATETIME NOT NULL\xc2\xa0\xc2\xa0\n, ChangeStatus CHAR(1) NOT NULL\xc2\xa0\xc2\xa0\n)\xc2\xa0\xc2\xa0\n\n-- If this is the first run (or the CandidateSync table is empty for another reason) then just take the hit now\xc2\xa0\xc2\xa0\n-- and process the entire set of candidates in one go.\xc2\xa0\xc2\xa0\n\nIF EXISTS(SELECT TOP 1 1 FROM CandidateSync)\xc2\xa0\xc2\xa0\nSET ROWCOUNT @BatchSize\xc2\xa0\xc2\xa0\n\nINSERT INTO @Changes\xc2\xa0\xc2\xa0\n(\xc2\xa0\xc2\xa0\n  CandidateNo\xc2\xa0\xc2\xa0\n, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 query-performance

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

哈萨克语不区分大小写排序规则中的字符问题

我对 \xd0\xa1yrillic 字符 'E' 和 'e' 有问题,当使用不区分大小写的排序规则时,它们应该相等。这对于除哈萨克语之外的所有校对都是正确的。

\n

我使用下面的查询检查了所有 CI 排序规则:

\n
SELECT 'DECLARE @Test_' + name + ' TABLE (\n    Code nvarchar(32) COLLATE ' + name + '\n)\n\nINSERT @Test_' + name + ' (Code)\nVALUES (N''\xd0\x95''), (N''\xd0\xb5'')\n\nSELECT ''' + name + ''', * FROM @Test_' + name + ' WHERE Code = N''\xd0\x95'' COLLATE ' + name \n\nFROM sys.fn_helpcollations()\nWHERE name LIKE '%CI%'\n
Run Code Online (Sandbox Code Playgroud)\n

对于所有排序规则,都会按预期返回两行,但哈萨克语除外。

\n

用于说明问题的示例查询:

\n
SET NOCOUNT ON;\n\nDECLARE @Test TABLE (\n    Code nvarchar(32) COLLATE Kazakh_90_CI_AS\n);\n\nDECLARE @UpperChar  nchar(1) = …
Run Code Online (Sandbox Code Playgroud)

sql-server collation

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

SQL Server 2016 UPDATE 语句 - 变量赋值是否始终在列更新之前处理?

我们的一位应用程序开发人员向我提出了一个有趣的问题。在下面的代码中,您将看到更新语句将当前列值分配给两个变量,同时还将这些相同的列更新为新值。

\n

问题是,是否保证变量@oStart和@oFinish将被分配给[Start]和[Finish]的值而不是值?在测试中,情况确实如此,但是,我想确认这是有保证的行为。

\n

我预计答案是“不 - 不能保证”,最终,这取决于优化器所做的决定。无论如何,无论如何,这种模棱两可的代码都是不鼓励的(有更优雅和可读的编写方式),但有兴趣听到每个人的想法。

\n
-- Parameters\nDECLARE @StartDate smalldatetime = '2022-01-01',\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @EndDate smalldatetime = '2022-12-31';\n\n-- Body\nDECLARE @oStart smalldatetime,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @oFinish smalldatetime;\n\nUPDATE\xc2\xa0 [dbo].[MyTable]\nSET\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @oStart = [Start],\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 @oFinish = [Finish],\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 [Start] = @StartDate,\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 [Finish] = @EndDate\nWHERE\xc2\xa0\xc2\xa0 [ID] = 12;\n
Run Code Online (Sandbox Code Playgroud)\n

sql-server t-sql

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