标签: sql-server-2016

SQL Server 定期清除计划缓存和执行统计信息

将 SQL Server 2014 升级到 2016 后,服务器每隔几个小时就会不断重置缓存的执行计划和dm*视图(如dm_exec_query_stats)等

至于如果有人执行DBCC FREEPROCCACHEDBCC DROPCLEANBUFFERS手动(除了没人做,它会自动发生)。

同一个数据库在 SQL Server 2014 和 Windows Server 2012 上运行良好,但在迁移到 SQL Server 2016(和 Windows Server 2016)后事情就变糟了

事情我检查:数据库并没有具备“自动关闭”标志。SQL 服务器ad hoc optimized设置为true(我认为它会有所帮助,但它没有)。“查询存储”为“关闭”。服务器有 16 GB 内存。

“SQL Server 日志”中也没有任何帮助。只是每周备份消息...

我还检查了这篇文章https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-set-options(向下滚动到“示例”部分,就在上面它)有自动清除计划的情况列表。这些都不适用。

更新:

不幸的是,这些建议都没有帮助。授予 LPIM 权限,检测和修复为同一查询生成大量计划的非参数化查询,降低“最大服务器内存”......计划不断随机重置,从每几个小时到每 5-10 分钟。如果服务器“处于内存压力之下”,为什么 2014 版本在同一台机器上运行良好。

这是请求的 sp_Blitz 输出

**Priority 10: Performance**:

- Query Store Disabled - The new SQL Server 2016 Query …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016

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

什么是“部分匹配索引”?

我正在尝试了解有关 SQL Server 2016 中引入的“外键引用检查”查询计划运算符的更多信息。关于它的信息并不多。微软在这里宣布了它,我在这里发表了关于它的博客。通过从具有 254 个或更多传入外键引用的父表中删除一行,可以看到新的运算符:dbfiddle link

操作员详细信息中显示了三种不同的计数:

FK检查详情

  • 外键引用计数是传入外键的数量。
  • No matching Indexes Count是没有合适索引的传入外键的数量。验证更新或删除的表不会违反该约束将需要扫描子表。
  • 我不知道Partial Matching Indexes Count代表什么。

在这种情况下什么是部分匹配索引?我无法使以下任何一项工作:

  • 过滤索引
  • 将外键列作为INCLUDE索引列
  • 以外键列作为第二键列的索引
  • 多列外键的单列索引
  • 创建多个覆盖索引以启用多列外键的“索引连接”计划

Dan Guzman指出,即使索引键与外键列的顺序不同,多列外键也可以匹配索引。他的代码在这里,以防有人能够使用它作为起点来找出更多关于部分匹配索引的信息。

index foreign-key sql-server sql-server-2016

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

为什么搜索 LIKE N'%?%' 匹配任何 Unicode 字符并且 = N'?' 匹配很多?

DECLARE @T TABLE(
  Col NCHAR(1));

INSERT INTO @T
VALUES      (N'A'),
            (N'B'),
            (N'C'),
            (N'?'),
            (N'?'),
            (N'?');
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM   @T
WHERE  Col LIKE N'%?%'
Run Code Online (Sandbox Code Playgroud)

退货

Col
A
B
C
?
?
?
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM   @T
WHERE  Col = N'?' 
Run Code Online (Sandbox Code Playgroud)

退货

Col
?
?
?
Run Code Online (Sandbox Code Playgroud)

使用下面的生成每个可能的双字节“字符”显示=版本匹配其中的 21,229 个和LIKE N'%?%'所有版本(我尝试了一些非二进制排序规则,结果相同)。

WITH T(I, N)
AS 
(
SELECT TOP 65536 ROW_NUMBER() OVER (ORDER BY @@SPID),
                 NCHAR(ROW_NUMBER() OVER (ORDER BY @@SPID))
FROM master..spt_values v1, 
     master..spt_values v2
)
SELECT I, N 
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server like unicode sql-server-2016

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

为什么子查询将行估计减少到 1?

考虑以下人为但简单的查询:

SELECT 
  ID
, CASE
    WHEN ID <> 0 
    THEN (SELECT TOP 1 ID FROM X_OTHER_TABLE) 
    ELSE (SELECT TOP 1 ID FROM X_OTHER_TABLE_2) 
  END AS ID2
FROM X_HEAP;
Run Code Online (Sandbox Code Playgroud)

我希望此查询的最终行估计值等于X_HEAP表中的行数。无论我在子查询中做什么,对于行估计都无关紧要,因为它无法过滤掉任何行。但是,在 SQL Server 2016 上,由于子查询,我看到行估计值减少到 1:

错误查询

为什么会发生这种情况?我该怎么办?

使用正确的语法很容易重现这个问题。这是一组可以执行此操作的表定义:

CREATE TABLE dbo.X_HEAP (ID INT NOT NULL)
CREATE TABLE dbo.X_OTHER_TABLE (ID INT NOT NULL);
CREATE TABLE dbo.X_OTHER_TABLE_2 (ID INT NOT NULL);

INSERT INTO dbo.X_HEAP WITH (TABLOCK)
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values;

CREATE STATISTICS X_HEAP__ID ON X_HEAP …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016 cardinality-estimates

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

varchar(255) 还是 varchar(256)?

我应该在设计表格时使用varchar(255)varchar(256)吗?我听说一个字节用于列的长度,或用于存储元数据。

在这一点上它不再重要了吗?

我在互联网上看到了一些帖子,但是它们适用于 Oracle 和 MySQL。

我们有 Microsoft SQL Server 2016 企业版,它如何应用于这种环境?

现在举个例子,如果我告诉我的客户保留例如 255 个字符而不是 256 个字符的文本描述,有什么区别吗?我读到的内容“最大长度为 255 个字符,DBMS 可以选择使用单个字节来指示字段中数据的长度。如果限制为 256 或更大,则需要两个字节。” 这是真的?

database-design sql-server varchar sql-server-2016 enterprise-edition

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

如何在 SQL Server 消息窗口中禁用“完成时间:...”

我在 SSMS 中运行的每个查询都会附加令人讨厌的消息:“完成时间:...”。

如何禁用该文本?

sql-server ssms sql-server-2016

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

为什么这个 MERGE 语句会导致会话被终止?

我有以下MERGE针对数据库发出的语句:

MERGE "MySchema"."Point" AS t
USING (
       SELECT "ObjectId", "PointName", z."Id" AS "LocationId", i."Id" AS "Region"
         FROM @p1 AS d
         JOIN "MySchema"."Region" AS i ON i."Name" = d."Region"
    LEFT JOIN "MySchema"."Location" AS z ON z."Name" = d."Location" AND z."Region" = i."Id"
       ) AS s
   ON s."ObjectId" = t."ObjectId"
 WHEN NOT MATCHED BY TARGET 
    THEN INSERT ("ObjectId", "Name", "LocationId", "Region") VALUES (s."ObjectId", s."PointName", s."LocationId", s."Region")
 WHEN MATCHED 
    THEN UPDATE 
     SET "Name" = s."PointName"
       , "LocationId" = s."LocationId"
       , "Region" …
Run Code Online (Sandbox Code Playgroud)

sql-server merge sql-server-2014 sql-server-2016

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

为什么这个查询不使用索引假脱机?

我问这个问题是为了更好地了解优化器的行为并了解索引假脱机的限制。假设我将 1 到 10000 之间的整数放入堆中:

CREATE TABLE X_10000 (ID INT NOT NULL);
truncate table X_10000;

INSERT INTO X_10000 WITH (TABLOCK)
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
Run Code Online (Sandbox Code Playgroud)

并强制嵌套循环连接MAXDOP 1

SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID = b.ID
OPTION (LOOP JOIN, MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

这是对 SQL Server 采取的相当不友好的操作。当两个表都没有任何相关索引时,嵌套循环连接通常不是一个好的选择。这是计划:

错误查询

在我的机器上查询需要 13 秒,从 table spool 中提取了 100000000 行。但是,我不明白为什么查询必须很慢。查询优化器能够通过索引假脱机动态创建索引。这个查询似乎是索引假脱机的完美候选者。

以下查询返回与第一个相同的结果,具有索引假脱机,并且在不到一秒的时间内完成:

SELECT *
FROM X_10000 a
CROSS APPLY …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization index-spool sql-server-2016

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

证书链由不受信任的机构颁发

前段时间我在 Windows 10 家庭版环境(准确地说是笔记本电脑)上安装了 SQL Server 2016 开发者版,一切都很好。

然后有人——盒子的管理员——决定在没有告诉我的情况下重命名盒子。

之后,当尝试连接到 SQL 服务器时,我们遇到了以下错误消息:

在此处输入图片说明

在此处输入图片说明

这是一个与此非常相似的问题:

从 Azure 网站连接 VM 角色中的 DB 时,“证书链由不受信任的机构颁发”

我也去过这里:

目标主体名称不正确。无法生成 SSPI 上下文。(Microsoft SQL Server,错误:0)

我一直在使用 Kerberos 配置管理器,它给了我不同的错误消息

在此处输入图片说明

我应该说 我能够通过 SQL 服务器身份验证连接到这个 SQL 服务器实例,但我想使用 Windows 身份验证进行连接。

只是要清楚 - 这都是本地机器,不属于任何域。

我不太确定如何从这里开始,我想要的是使用 Windows 身份验证。

与证书相关的错误信息让我想到这里重新颁发证书。我不确定如何完成这项工作,或者这是否是解决这种情况的有效方法。

我今天不会在这台机器附近,但我会尽快赶上。如果时间允许,我会继续我的研究。

authentication sql-server kerberos sql-server-2016 certificate

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

为什么创建一个简单的 CCI 行组最多需要 30 秒?

当我注意到我的一些插入花费的时间比预期的要长时,我正在做一个涉及 CCI 的演示。要重现的表定义:

DROP TABLE IF EXISTS dbo.STG_1048576;
CREATE TABLE dbo.STG_1048576 (ID BIGINT NOT NULL);
INSERT INTO dbo.STG_1048576
SELECT TOP (1048576) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

DROP TABLE IF EXISTS dbo.CCI_BIGINT;
CREATE TABLE dbo.CCI_BIGINT (ID BIGINT NOT NULL, INDEX CCI CLUSTERED COLUMNSTORE);
Run Code Online (Sandbox Code Playgroud)

对于测试,我将从临时表中插入所有 1048576 行。只要它没有因某种原因被修剪,这就足以填充一个压缩的行组。

如果我插入所有整数 mod 17000,它需要不到一秒钟的时间:

TRUNCATE TABLE dbo.CCI_BIGINT;

INSERT INTO dbo.CCI_BIGINT WITH (TABLOCK)
SELECT ID % 17000
FROM dbo.STG_1048576
OPTION (MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

SQL Server 执行时间:CPU 时间 = 359 …

sql-server columnstore sql-server-2016

20
推荐指数
3
解决办法
669
查看次数