Questions tagged «sql-server-2016»

SQL Server 2016(主要版本13.00.xxxx)。还请标记sql-server。


3
SQL Server的“总服务器内存”消耗停滞了数月,而可用空间增加了64GB以上
我遇到了一个奇怪的问题,即SQL Server 2016 Standard Edition 64位似乎已经限制了为其分配的总内存的正好一半(128 GB的64GB)。 输出@@VERSION为: Microsoft SQL Server 2016(SP1-CU7-GDR)(KB4057119)-13.0.4466.4(X64)2017年12月22日11:25:00版权所有(c)Windows Server 2012 R2 Datacenter 6.3上的Microsoft Corporation标准版(64位)(内部版本9600:)(管理程序) 输出sys.dm_os_process_memory为: 当我查询时sys.dm_os_performance_counters,我看到Target Server Memory (KB)处的131072000,Total Server Memory (KB)位于处的一半65308016。在大多数情况下,我认为这是正常现象,因为SQL Server尚未确定它需要为其自身分配更多的内存。 但是,它已经“卡住”了〜64GB,已经超过2个月了。在此时间段内,我们对某些数据库执行了大量内存密集型操作,并向实例添加了近40个数据库。我们共有292个数据库,每个数据库都有4GB的预分配数据文件(自动增长速率为256MB)和2GB的日志文件的自动增长速率为128MB。我每晚晚上12:00执行一次完整备份,并从星期一到星期五从6:00 AM到8:00 PM(每15分钟间隔)开始事务日志备份。这些数据库的整体吞吐量相对较低,但是我怀疑SQL Server尚未爬到Target Server Memory 很自然地会通过添加新数据库,正常查询执行以及已运行的占用大量内存的ETL管道来实现。 SQL Server实例本身位于虚拟化(VMware)Windows Server 2012R2服务器之上,该服务器具有12个CPU,144GB内存(128GB到SQL Server,16GB预留给Windows)以及总共4个虚拟磁盘,这些虚拟磁盘位于具有15K SAS驱动器的vSAN之上。Windows自然位于64GB C:磁盘上,页面文件为32GB。数据文件位于2TB D:磁盘上,日志文件位于2TB L:磁盘之上,而tempdb位于256GB T:磁盘上,其中8x16GB文件没有自动增长。 我已验证除之外,服务器上没有其他SQL Server实例在运行MSSQLSERVER。 该服务器完全专用于SQL Server实例,因此我们没有在其上运行的其他任何可能消耗内存的应用程序或服务。 我利用RedGate SQL …

3
为什么SELECT查询会导致写入?
我注意到,在运行SQL Server 2016 SP1 CU6的服务器上,有时扩展事件会话会显示导致写入的SELECT查询。例如: 执行计划未显示任何明显的写入原因,例如哈希表,假脱机或可能溢出到TempDB的排序: 将变量分配给MAX类型或自动更新统计信息也可能导致这种情况,但在这种情况下,两者都不是导致写入的原因。 写的东西还有什么呢?

1
有哪些客观原因会首选SQL Server 2016而不是早期版本?
自从SQL Server 2005或2008年以来,由于Microsoft更加频繁地进行SQL Server版本升级,因此许多公司发现很难确定何时必须进行升级!而升级是“不错的选择” 本着一些以前的问题的精神,他们问为什么比以前的版本更喜欢各种SQL Server的较新版本,公司可能会考虑一些客观的技术或业务原因,以便公司将SQL Server 2016升级到较早的版本,甚至更高的版本。发布,例如SQL Server 2014? (关于SQL Server 2012与SQL Server 2008相比的这个问题,或者关于SQL Server 2012与SQL Server 2005相比的一个问题,就是这个问题的精神的示例。它们的答案还扩展了此处的一些原因。 SQL Server 2008或SQL Server 2005开始的公司)

4
使用SQL CLR标量函数模拟HASHBYTES的可伸缩方法是什么?
作为ETL流程的一部分,我们将暂存中的行与报表数据库进行比较,以找出自从上次加载数据以来是否实际更改了任何列。 比较是基于表的唯一键和所有其他列的某种哈希值。我们目前使用HASHBYTES该SHA2_256算法,并且发现如果许多并发工作线程都在调用,则该算法无法在大型服务器上扩展HASHBYTES。 在96台核心服务器上进行测试时,以每秒哈希数衡量的吞吐量不会增加超过16个并发线程。我通过将并发MAXDOP 8查询数从1 更改为12进行测试。测试MAXDOP 1显示了相同的可伸缩性瓶颈。 作为一种解决方法,我想尝试一个SQL CLR解决方案。这是我尝试陈述要求的尝试: 该功能必须能够参与并行查询 函数必须是确定性的 该函数必须接受NVARCHAR或VARBINARY字符串的输入(所有相关列都串联在一起) 字符串的典型输入大小为100-20000个字符。20000不是最大值 哈希冲突的机会应大致等于或优于MD5算法。CHECKSUM对我们不起作用,因为有太多的碰撞。 该功能必须在大型服务器上很好地扩展(随着线程数量的增加,每个线程的吞吐量不应显着降低) 对于Application Reasons™,假定我无法保存报表的哈希值。这是一个不支持触发器或计算列的CCI(还有其他我不想讨论的问题)。 HASHBYTES使用SQL CLR函数进行仿真的可扩展方式是什么?我的目标可以表示为在大型服务器上每秒获得尽可能多的哈希,因此性能也很重要。我对CLR感到很糟糕,所以我不知道该如何完成。如果它激励任何人回答,我计划在可能的情况下尽快为这个问题添加赏金。下面是一个示例查询,它非常粗略地说明了用例: DROP TABLE IF EXISTS #CHANGED_IDS; SELECT stg.ID INTO #CHANGED_IDS FROM ( SELECT ID, CAST( HASHBYTES ('SHA2_256', CAST(FK1 AS NVARCHAR(19)) + CAST(FK2 AS NVARCHAR(19)) + CAST(FK3 AS NVARCHAR(19)) + CAST(FK4 AS NVARCHAR(19)) + …

1
急切的后台打印操作符对于从群集的列存储中进行此删除有用吗?
我正在测试从群集的列存储索引中删除数据。 我注意到执行计划中有一个急切的假脱机操作员: 具有以下特征: 删除6000万行 1.9使用GiB TempDB 14分钟执行时间 连续计划 1在线轴上重新绑定 估计扫描成本:364.821 如果我诱使估算器低估了,我会得到一个更快的计划,避免使用TempDB: 估计扫描成本:56.901 (这是一个估计的计划,但是注释中的数字正确。) 有趣的是,如果我通过运行以下命令刷新增量存储,则线轴会再次消失: ALTER INDEX IX_Clustered ON Fact.RecordedMetricsDetail REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON); 仅当增量存储中的页面阈值超过某个阈值时才引入假脱机。 要检查增量存储的大小,我正在运行以下查询来检查表的行内页面: SELECT SUM([in_row_used_page_count]) AS in_row_used_pages, SUM(in_row_data_page_count) AS in_row_data_pages FROM sys.[dm_db_partition_stats] as pstats JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id WHERE p.[object_id] = OBJECT_ID('Fact.RecordedMetricsDetail'); 第一个计划中的假脱机迭代器是否有任何合理的好处?我必须假定它旨在提高性能,而不是用于万圣节保护,因为它的存在不一致。 …

6
为什么我的SELECT DISTINCT TOP N查询会扫描整个表?
我遇到了一些SELECT DISTINCT TOP N查询,这些查询似乎没有被SQL Server查询优化器优化。让我们从一个简单的例子开始:一个带有两个交替值的百万行表。我将使用GetNums函数生成数据: DROP TABLE IF EXISTS X_2_DISTINCT_VALUES; CREATE TABLE X_2_DISTINCT_VALUES (PK INT IDENTITY (1, 1), VAL INT NOT NULL); INSERT INTO X_2_DISTINCT_VALUES WITH (TABLOCK) (VAL) SELECT N % 2 FROM dbo.GetNums(1000000); UPDATE STATISTICS X_2_DISTINCT_VALUES WITH FULLSCAN; 对于以下查询: SELECT DISTINCT TOP 2 VAL FROM X_2_DISTINCT_VALUES OPTION (MAXDOP 1); …

2
什么是“部分匹配指数”?
我试图了解有关SQL Server 2016中引入的“外键引用检查”查询计划运算符的更多信息。那里没有很多有关它的信息。微软在这里宣布了它,我在这里发表了博客。通过从具有254个或更多传入外键引用的父表中删除一行,可以看到new运算符:dbfiddle link。 操作员详细信息中显示三种不同的计数: 外键引用计数是传入外键的数量。 没有匹配的索引计数是没有合适索引的传入外键的数量。验证更新或删除的表不会违反该约束将需要对子表进行扫描。 我不知道部分匹配索引计数代表什么。 在这种情况下,什么是部分匹配索引?我无法进行以下任何工作: 筛选索引 将外键列作为INCLUDE索引的列 使用外键列作为第二个键列的索引 多列外键的单列索引 创建多个覆盖索引以为多列外键启用“索引连接”计划 Dan Guzman指出,即使索引键的顺序与外键列的顺序不同,多个列的外键也可以匹配索引。他的代码是在这里,以防有人能够以它为起点来进一步了解部分匹配索引。

2
为什么子查询将行估算值减少到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; 我希望此查询的最终行估计等于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 …

4
带问号的蓝色图标-这是什么意思?
SQL Server实例是可访问的,似乎还不错。 Microsoft SQL Server 2016(SP1-CU2)(KB4013106)-13.0.4422.0(X64) 2017年3月6日14:18:16版权所有(c)Windows Server 2012 R2 Standard 6.3(Build 9600)上的Microsoft Corporation Enterprise Edition(64位) :)(管理程序) 但是白色问号是什么意思? 这些图标在我刷新时不会消失。我是sql server内部的sysadmin,外部是该框中的管理员。 我注意到的另一件事,您可以在下面的图片中看到。这是2个不同的Management Studio会话。 在最上面的一个,我以我自己的身份登录DBA and sysadmin,在第二个上,我与Management Studio一起run as a different user使用,并且我使用了用于复制的域帐户,而不是sysadmin。 第二台也有blue icon此服务器和其他服务器中的,而我的是正常的绿色服务器。

3
SQL Server定期清除计划缓存和执行状态
将SQL Server 2014升级到2016后,服务器每隔几个小时会不断重置缓存的执行计划和dm*视图(如dm_exec_query_stats)等。 就像有人执行DBCC FREEPROCCACHE并DBCC DROPCLEANBUFFERS手动执行一样(除了没有人执行之外,它会自动发生)。 相同的数据库在SQL Server 2014和Windows Server 2012上都可以正常工作,在迁移到SQL Server 2016(和Windows Server 2016)之后一切都变了。 事情我检查:数据库并没有具备“自动关闭”标志。SQL Server ad hoc optimized设置为true(我认为这会有所帮助,但没有帮助)。“查询存储”为“关闭”。服务器有16 GB内存。 “ SQL Server日志”中也没有任何帮助。只是每周的备份消息... 我还检查了这篇文章https://docs.microsoft.com/zh-cn/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 Store feature has not been enabled on …

1
为什么此查询不使用索引假脱机?
我问这个问题是为了更好地了解优化器的行为并了解索引假脱机的限制。假设我将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; 并强制嵌套循环加入MAXDOP 1: SELECT * FROM X_10000 a INNER JOIN X_10000 b ON a.ID = b.ID OPTION (LOOP JOIN, …

1
为什么此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 …

3
varchar(255)还是varchar(256)?
我应该使用表格varchar(255)还是varchar(256)设计表格?我听说一个字节用于列的长度或存储元数据。 现在重要吗? 我在互联网上看到了一些帖子,但是它们适用于Oracle和MySQL。 我们拥有Microsoft SQL Server 2016企业版,它如何应用于此环境? 现在说,例如,如果我告诉客户保留文本描述为255个字符而不是256个字符,会有什么区别吗?我读到的内容“最大长度为255个字符的DBMS可以选择使用单个字节来指示字段中数据的长度。如果限制为256或更大,则将需要两个字节。” 这是真的?

1
为什么搜索LIKE N'% %'匹配任何Unicode字符而=N' '匹配很多呢?
DECLARE @T TABLE( Col NCHAR(1)); INSERT INTO @T VALUES (N'A'), (N'B'), (N'C'), (N'Ƕ'), (N'Ƿ'), (N'Ǹ'); SELECT * FROM @T WHERE Col LIKE N'%�%' 退货 Col A B C Ƕ Ƿ Ǹ SELECT * FROM @T WHERE Col = N'�' 退货 Col Ƕ Ƿ Ǹ 使用下面的代码生成每个可能的双字节“字符”表明,该=版本与它们中的21,229个以及LIKE N'%�%'所有版本中的匹配(我尝试了一些具有相同结果的非二进制排序规则)。 WITH T(I, N) AS …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.