标签: sql-server-2016

SQL Server 2016 AlwaysOn VDI_CLIENT_WORKER 命令

我在 SQL Server 2016 SP1 Standard 上设置了 AlwaysOn AG。然后我创建了一个 AG 并添加了一个带有自动种子(同步模式)的数据库。我使用 SSMS 2017 来创建我的 AG 并添加数据库。一切正常。

但是,当我检查等待统计信息时,我在主服务器上获得了 VDI_CLIENT_OTHER (80%) 类型的等待,平均资源时间为 42 秒。经过一番研究,我发现等待是由执行命令 VDI_CLIENT_WORKER 的 4 个会话生成的。据我了解,等待意味着在播种新 AG 时线程正在等待工作。但我不明白的是为什么我有那些等待,因为我的 AG 准备好了,为什么我有 4 个执行 VDI_CLIENT_WORKER 命令的会话?我发现每个调度程序都有一个 VDI_CLIENT_WORKER

有人可以尝试解释 VDI_CLIENT_WORKER-command 的作用以及如何解决许多 VDI_CLIENT_OTHER 等待的问题吗?

sql-server availability-groups sql-server-2016

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

IN 子句中的冗余条目

我有一个带有 where 子句的动态构建查询,如下所示:

where column in ('a', 'a', 'a', 'b')

实际数据要长很多,有很多重复项,如上面的示例中a重复了 3 次。

对于WHERE使用IN具有大量值(其中许多是重复值)的非常大的子句,是否存在潜在的性能影响?

performance sql-server t-sql sql-server-2016 query-performance

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

安排每日检查点是个好主意吗?

检查我们昨天的生产日志,我们发现在大约 5 分钟的时间内,一大堆非常简单的查询超时。对服务器日志的进一步调查显示磁盘活动激增,这使我得出结论,当时正在数据库上运行自动 CHECKPOINT。

这是我真的不想在高峰时段发生的事情。所以我想每天在非高峰时间安排一个每日检查点。

这是一个好主意吗?馊主意?浪费时间?如果不是这样,那又是什么?

sql-server sql-server-2016

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

任何人都可以为所有使用 SQL Server 2016 标准版的用户数据库推荐一种加密方法吗?

我们的客户坚持要求我们现在加密他们所有的 SQL Server 静态数据,其中必须包括 tempdb。我想我有以下选择——

  • Bitlocker 整个驱动器
  • TDE(但企业版的成本打破了我们对这些客户的支持模式!)
  • 始终加密(但更像是 GDPR/个人信息解决方案,不适用于整个数据库)——然后不能“通配符”搜索这些字段,这是一项要求。
  • EFS 磁盘上的用户数据库位置
  • 一些进行 SQL Server 加密的第三方应用程序
  • 其他的?

感谢任何建议(仅适用于 SQL Server 2016标准版)

sql-server encryption standard-edition sql-server-2016

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

SQL Server 在哪里存储对称密钥?

我想知道在特定数据库中创建的对称密钥是否存储在主文件组中?

或者它们存储在用户无法与之交互的某些特殊文件组中?

例如,如果我对文件组(主要或次要)执行部分备份,我可以确定备份不包含对称密钥吗?

sql-server filegroups t-sql sql-server-2016 symmetric-key

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

将 IN 与 EXISTS 交换会产生不同的结果集

我正在尝试更新使用子句谓词中的IN运算符的查询,以比较潜在的性能改进并更好地了解当两者互换时幕后发生的事情。这是我的理解,在实践中,查询优化器对待,并以同样的方式时,它可以。WHEREEXISTSEXISTSIN

我注意到当使用IN运算符运行查询时,它返回所需的结果集。但是,当我用EXISTS等效项替换它时,它会从我要过滤的主表中提取所有值。它忽略传递给EXISTS (SELECT ...并返回所有可能的不同值的提供的输入值。

用例相对简单:查询接受一个管道分隔的@Series字符串,最多可以包含 4 个值,例如S1|S2|S3|S4S2|S4。在这里,我string_split将输入到一个表中的变量@SeriesSplit,以确定相应的内部[SeriesId][Series]。然后过滤返回的结果集以排除[Series]未通过的结果。

为了说明,这里有一个类似的表定义:

DROP TABLE IF EXISTS [dbo].[Document]
IF OBJECT_ID('[dbo].[Document]', 'U') IS NULL
BEGIN
    CREATE TABLE [dbo].[Document] (
        [DocumentId] bigint IDENTITY(1,1) NOT NULL
        ,[DocumentSeriesId] [tinyint] NOT NULL
        ,CONSTRAINT [PK_Document] PRIMARY KEY CLUSTERED ([DocumentId] ASC)
        ,INDEX [IX_Document_SeriesId] NONCLUSTERED ([DocumentSeriesId] ASC)
    );
END;
GO
Run Code Online (Sandbox Code Playgroud)

用虚拟数据填充测试表。

SET IDENTITY_INSERT [dbo].[Document] ON; …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan sql-server-2016 query-performance

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

SQL Server 2016 到期日期

我有一个关于 SQL Server 2016 安装的问题。

我们安装了 2017/09/19 制作的试用版

根据我在数据库中执行的脚本,到期日期是 2018/03/18 但我们仍然可以毫无问题地使用它。

使用此数据库的 Sharepoint 站点不会给出任何错误或警告图例,说明它已过期或某些功能不再可用。我还可以从 MSQLServer Management Studio 进入并执行脚本、创建新数据库等。

怎样才能准确知道保质期?

SELECT
@@SERVERNAME as SERVERNAME,
CREATE_DATE as INSTALALTIONDATE,
SERVERPROPERTY('EDITION') as Version,
DATEADD(DD, 180, CREATE_DATE) AS "EXPIRY DATE"
FROM SYS.SERVER_PRINCIPALS
WHERE SID = 0X010100000000000512000000

SERVERNAME      INSTALLATIONDATE        Version                                 EXPIRY DATE
SAHARCVSPS02    2017-09-19 13:15:20.967 Enterprise Evaluation Edition (64-bit)  2018-03-18 13:15:20.967
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016

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

SQL Server 服务帐户

我们有一台新的 Windows 2016 服务器,我必须安装 SQL Server 2016 标准版。安装和配置 SQL 服务器后,我会将现有的生产数据库移动到新的数据库服务器。

我可以远程桌面访问服务器以安装 SQL 服务器,但不确定是否需要域服务帐户?我的印象是 SQL 服务器在安装过程中分配的默认服务就足够了。

问题 1:

DB Admin 团队将远程桌面连接到该服务器并使用 SSMS 连接到 SQL 服务器,而不是从他们的本地 SSMS。在这种情况下,我是否必须拥有域服务帐户?

问题2:

DB支持的应用程序将有几百个用户通过网络连接?在这种情况下,默认服务帐户就足够了,还是我必须拥有域服务帐户?

我是数据库管理领域的新手,所以我仍然在为几个概念苦苦挣扎。

sql-server users sql-server-2016

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

DATEDIFF(MINUTE, 0, <Date>) 中的 0 实际上是什么意思?

因此,我们的数据团队寻求帮助以解决他们遇到的问题。我最终将其追踪到了一些真正超出范围的数据 (1/1/0001) 和他们使用的 DATEDIFF 函数。虽然我已经解决了他们的问题,但实际上我并不知道 0 在他们使用时会变成什么。

我最初认为它更接近整数溢出而不是真正的转换错误,但事实并非如此。我在带有 DATEDIFF_BIG 和相同错误的 SQL 2016 框中尝试了它。我有一个样本供你们在下面一起玩,以及哪些有效,哪些无效。

/** Setup The Sample */
DECLARE @TestValue DATETIME2(7)
SET @TestValue = '0001-01-01 10:30:00.0000000'

/** Conversion Error 
Msg 242, Level 16, State 3, Line 10
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
*/
SELECT DATEDIFF(MINUTE, 0, @TestValue)

--Also does not work, same error.
SELECT DATEDIFF_BIG(MINUTE, 0, @TestValue)

/** Works */
SELECT DATEDIFF(MINUTE, '1/1/1900', @TestValue)

/** Works */
SELECT …
Run Code Online (Sandbox Code Playgroud)

datetime datetime2 sql-server-2016

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

如何在没有光标的情况下将行插入到具有“订单”列的表中

我有一个带有订单/位置列的 SQL Server 2016 表。此列是一个 INT,用于指示表中行的首选顺序/位置以供演示。

如何在不使用游标的情况下在位置 1 插入一行?(即新行的位置为 1,现有行 - 假设在插入之前顺序正确 - 必须“向下移动”)

order/position 列不是 NULL 并强制为 UNIQUE。我也不想使用“钝力”技术,例如将所有行的顺序/位置值设置为一些“从未使用”的值,然后只对所有行执行重新排序。

sql-server sql-server-2016

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