Questions tagged «sql-server-2014»

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

1
高PAGELATCH_ *和WRITELOG等待。他们有关系吗?
我们看到非常高的PAGELATCH_EX和PAGELATCH_SH等待类型以及较高的WRITELOG等待。我已经诊断出导致PAGELATCH等待的查询,并且可以通过降低插入由IDENTITY值定义的繁忙集群主键的插入率来消除它们。我知道这种现象被称为最后一页插入闩锁争用。 但是我的问题是,当插入新记录时,SQL Server是否在缓冲区页面上执行排他的PAGELATCH_EX,将记录​​插入缓冲区页面,将记录写入事务日志,然后释放排他的PAGELATCH_EX,详情如下:https:// www.microsoft.com/zh-cn/download/details.aspx?id=26665第24页。还是先将记录写到事务日志中,然后再进行PAGELATCH_EX的详细说明,“解决高度并发的PAGELATCH争用-插入工作负载-背景信息SQLCAT的指南:关系引擎 如果将记录写到锁存机制之外的日志中,那么我可以排除对磁盘的慢速写入,这是导致PAGELATCH等待时间较长的原因。但是,如果保持闩锁直到记录难以记录,那么我应该考虑WRITELOG。 同样,具有多个非聚集索引会导致PAGELATCH_ *锁存器保持更长的时间,即,如果表具有聚簇且多个非聚簇索引被同时添加并释放到每个索引缓冲区页的锁存器? 更新1 阅读confio-sql-server-writelog-wait幻灯片2和一般的WAL体系结构之后。现在,我的理解是,两本白皮书中详细介绍的“记录行已被修改的日志条目”步骤是指SQL Server在事务日志缓存(而不是磁盘)中记录更改。一旦事务完成或缓冲区已满,所有记录将立即刷新到磁盘。

2
如何使用TSQL动态更改数据库
我在尝试将SSMS的上下文动态更改为动态SQL中指定的数据库时遇到麻烦: EXEC sys.sp_executesql N'USE db1 ' ; 它成功执行,但是SSMS的数据库上下文未更改。 我已经尝试过对上面的内容做一些细微的修改,就像这样 DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50) SET @db = N'db1' SET @sql = N'Use ' + @db EXEC sp_executesql @sql 再次,它成功执行,但是数据库没有更改。

1
UPDATE STATISTICS…WITH ROWCOUNT后如何重置统计信息
为了进行查询调整和测试,您可以通过运行手动将行计数和页计数分配给表的索引统计信息UPDATE STATISTICS。但是,如何将统计信息重新计算/重置为表的实际内容? --- Create a table.. CREATE TABLE dbo.StatTest ( i int NOT NULL, CONSTRAINT PK_StatTest PRIMARY KEY CLUSTERED (i) ); GO --- .. and give it a thousand-or-so rows: DECLARE @i int=1; INSERT INTO dbo.StatTest (i) VALUES (@i); WHILE (@i<1000) BEGIN; INSERT INTO dbo.StatTest (i) SELECT @i+i FROM dbo.StatTest; …

3
可怜的基数估计使INSERT无法进行最少的记录?
为什么第二个INSERT语句比第一个语句慢5倍? 从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,《数据加载性能指南》中的文档指出,两个插入都应该能够被最小限度地记录。因此,如果最小日志记录是关键性能差异,那么为什么第二个查询不符合最小日志记录的条件?可以采取什么措施来改善这种情况? 查询#1:使用INSERT ... WITH(TABLOCK)插入5MM行 考虑以下查询,该查询将5MM行插入堆中。该查询在中执行1 second并生成64MB事务日志数据,如所报告sys.dm_tran_database_transactions。 CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL) GO INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n) SELECT n -- Any table/view/sub-query that correctly estimates that it will generate 5MM rows FROM dbo.fiveMillionNumbers -- Provides greater consistency on my laptop, where other processes are running OPTION …

3
WITH CTE和WITH CTE(<column_names>)有什么区别?
如在MSDN上使用通用表表达式中所示,可以将CTE定义为: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition ) 并像这样使用它: SELECT &lt;column_list&gt; FROM expression_name; 假设我有2个CTE with cte1 as( select name from Table1 ) with cte2(name) as( select name from Table1 ) 由于内部查询相同,因此两个CTE的查询输出结果相同。两者之间的唯一区别是cte2(name)在其声明中定义了列name()。 当我执行两个CTE时,执行计划没有任何区别。 我只是好奇地知道: 如果我在CTE定义中未指定任何列名,会有什么区别? 为什么在创建CTE时应该/不应该指定列名? 它是否会偶然影响查询执行计划?(据我所知,这没有任何区别。)

1
批量插入后,外键变得不受信任
在具有2012兼容模式下数据库的SQL 2014版服务器(12.0.2430.0-尚无SP1)中(正在努力将其切换到2014 ...),我有少数几个外键对象,这些外键对象not trusted在数据库中始终标记为。我删除并重新创建了没有NOCHECK选项的它们,但是在5到10分钟内,它们再次变得不受信任,如果我生成CREATE脚本,它将显示为: ALTER TABLE [dbo].[Points] WITH NOCHECK ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO 使用的创建脚本为: ALTER TABLE [dbo].[Points] ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId] GO 没有复制,没有第三方工具,而且我正在监视数据库中的所有DDL语句,因此它不是另一个用户。 我能够很好地检查约束(WITH CHECK CHECK在每个约束上使用),但是不久之后它们仍然变得不受信任。只有运行的维护工作是Ola在AM的早期工作,并且整天都在进行。 更新: 因此,在经过几次跟踪以缩小可能性后,似乎BULK INSERT可能导致FK变得不可信。这个msdn问题指出,这是密钥变得不受信任的有效途径,这是我第一次听说。 所以我现在的问题是,有没有一种替代方法BULK INSERT可以保持外键is_trusted状态?它是在每小时运行几次的应用程序的上下文中执行的。我可以让开发人员批处理其插入语句,但是BULK INSERT如果不需要的话,我不希望在使用时使用最后通atum 。

1
来自系统健康状况扩展事件的错误流程利用?
我最近一直在努力了解存储在系统健康状况扩展事件事件文件中的数据或度量。 我们正在尝试使用此处提供的系统健康状况来实施性能指标的数据收集 有报告提供了从名为“系统运行状况”的事件中收集的指标,如CPU利用率,其他进程利用率等。 scheduler_monitor_system_health_ring_buffer_recorded 对于少数繁忙的服务器,我无法理解为什么报告中列为“ SQL CPU利用率”的字段“ process_utilization”大部分时间都高于100。在高峰时间,它在120-160之间变化,因此该报告是始终显示CPU高于100,即使我从服务器活动监视器中检查也是如此。 我已经在Github中提出了这个问题,但似乎没有解决方法或没有回应。 因此,我的问题是 如何使用记录的系统运行状况环形缓冲区获取服务器的SQL CPU利用率的准确数字? 报告还显示了根据其报告计算出的以下2个字段的计数器 100-System_idle-process_utilization和OtherProcessUtil 100-system_idle作为SystemUtil 这些OtherProcessUtil和SystemUtil需要/有什么帮助? 我还看到每次每次的内存利用率始终显示为100。这似乎也不正确。有人注意到吗? 其他工具(例如Idera和sentry)(我测试过)没有显示相同服务器的CPU使用率超过100%。对于相同的负载,我进行了并排比较。

2
根据更改日志计算库存数量
假设您具有以下表结构: LogId | ProductId | FromPositionId | ToPositionId | Date | Quantity ----------------------------------------------------------------------------------- 1 | 123 | 0 | 10002 | 2018-01-01 08:10:22 | 5 2 | 123 | 0 | 10003 | 2018-01-03 15:15:10 | 9 3 | 123 | 10002 | 10004 | 2018-01-07 21:08:56 | 3 4 …

1
如何为包含负值和零值的列乘行?
我试图获取按查询分组的特定列的所有行的乘积。我发现的大多数示例都将我引向了exp,sum并且log exp(sum(log([Column A]))) 我遇到的问题是该列包含一些零值,因此当零传递给log函数时出现此错误: 发生无效的浮点运算。 我以为我可以通过使用case表达式来解决这个问题,但是那似乎并没有像我认为的那样起作用,因为它似乎可以评估所有情况。 select Name, Product = case when min([Value]) = 0 then 0 when min([Value]) &lt;&gt; 0 then exp(sum(log(I))) -- trying to get the product of all rows in this column end from ids group by Name SqlFiddle 给定以下结果集: Id Name Value _________________________________ 1 a 1 …

1
谁在使用我的工作线程?SQL Server 2014-HADR
最近,我们在SQL Server 2014 HADR环境中遇到问题,其中一台服务器的工作线程不足。 我们收到消息: AlwaysOn可用性组的线程池无法启动新的工作线程,因为没有足够的可用工作线程。 我已经打开了另一个问题,以获得一个(我认为)应该帮助我分析问题的语句(是否可以查看哪个SPID使用哪个调度程序(工作线程)?)。尽管现在有了查询来查找正在使用系统的线程,但我不明白为什么该服务器用完了工作线程。 我们的环境如下: 4 Windows Server 2012 R2 SQL Server 2014企业版 24个处理器-&gt; 832个工作线程 256 GB内存 12个可用性组(整体) 642个数据库(整体) 因此,出现问题的服务器具有以下配置: 5个可用性组(3个主要/ 2个辅助) 325个数据库(127个主要/ 198个次要) MAXDOP = 8 Cost Threshold for Parallelism = 50 电源计划设置为“高性能” 为了“解决”该问题,我们手动将一个可用性组故障转移到辅助服务器。该服务器的配置现在为: 5个可用性组(2个主要/ 3个辅助) 325个数据库(77个主要数据库/ 248个辅助数据库) 我正在使用以下语句监视可用线程: declare @max int select @max = max_workers_count …


2
在SQL Server 2014上具有完全扫描的更新统计信息使用100%cpu,在2008 R2上为15%
为什么对于具有相同硬件功能的相同表,全扫描更新统计信息在SQL Server 2014上可能使用20%的CPU,而在SQL Server 2014上却使用100%的CPU? 我一直在寻找MAXDOP,其他选项,但实际上看不到任何脱颖而出的东西。我意识到可能存在可能导致这种情况的设置,但是两个数据库的设置都非常相似(例如,两个数据库的设置均为MAXDOP4,并且两个数据库都有多个内核)。两者都是企业版。 SQL Server 2014与SQL Server 2008 R2中是否有某些“不同之处”可以解释这一点?两台服务器的内存选项均为90%。对寻找什么有任何想法吗? 我每周在使用SQL Server 2008 R2 / SP3和SQL Server 2014 / SP2的两台服务器上以完整(100%)扫描运行更新统计信息,并且数据库具有相同的结构。在2008 R2服务器上,两个非常大的表的更新状态需要花费几个小时,这是我期望的,但是CPU始终保持在20%左右的利用率以下。但是,在2014年服务器上,CPU会在100%的时间内运行40分钟。这些表格在2014服务器上要小一些。我通过使用SQL Monitor分析菜单看到了这一点。 这是2014 SQL Server上Ola日志文件的输出,CPU从大约2:10到2:45达到100%: Date and time: 2017-06-24 02:10:20 Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN Outcome: Succeeded Duration: 00:07:48 Date and time: 2017-06-24 02:18:08 Date and …

1
仅选择超集
我有两个表(以及一个非聚集索引),可以使用以下命令创建: CREATE TABLE GroupTable ( GroupKey int NOT NULL PRIMARY KEY, RecordCount int NOT NULL, GroupScore float NOT NULL ); CREATE TABLE RecordTable ( RecordKey varchar(10) NOT NULL, GroupKey int NOT NULL, PRIMARY KEY(RecordKey, GroupKey) ); CREATE UNIQUE INDEX ixGroupRecord ON RecordTable(GroupKey, RecordKey); 从技术上讲,我的表略有不同,并且我要加入其他一些表,但这是适合我的情况的代理。 我想选择所有GroupKeys不是另一个子集的子集GroupKey。 对于给定的超集,我想获取其GroupScore所有子集(包括自身)的最大值。 在a GroupKey包含与RecordKeys另一个完全相同的情况下GroupKey(s),则仅GroupKeys会抓取其中一个(与哪个无关)。 任何GroupKey具有完全相同的RecordKeys另一个GroupKey(s)也会有相同的GroupScore。 不相关的GroupKeys也可以具有相同的分数。 …

3
指定的网络名称不再可用
我们有一个访问数据库的应用程序(SQL Server 2014企业版)。该应用程序调用存储过程来访问数据库。一切运行良好,直到最近开始发送以下错误并停止应用程序。重新启动应用程序可以暂时解决此问题,但稍后会遇到相同的错误。 错误:从服务器接收结果时发生传输级错误。(提供程序:TCP提供程序,错误:0-指定的网络名称不再可用。) 我进行了很多研究,其中大多数人指出这是网络问题,但找不到任何能真正解决问题的方法。有谁知道我应该在数据库方面进行哪些更改才能解决此问题。我非常感谢任何建议。

1
SQL Server-为什么更新语句中不允许使用窗口函数?
运行更新语句(例如下面的语句)时,我收到一条错误消息,告诉我 窗口函数只能出现在SELECT或ORDER BY子句中。 UPDATE dbo.Dim_Chart_of_Account SET Account_Order = LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) 我知道可以使用可更新的CTE轻松解决此问题,如下所示 WITH my_cte AS ( SELECT [Account_Order], LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) AS acc_order_lag FROM Dim_Chart_of_Account ) UPDATE my_cte SET [Account_Order] = acc_order_lag 我的问题是,是否有任何原因为什么不允许在更新语句中使用此方法,我应该避免使用可更新的CTE作为解决方法吗? 我担心的是,将窗口函数与更新语句一起使用时会出现问题,因此,我想了解这是一种可接受的方法还是应该避免。

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.