Questions tagged «sql-server-2016»

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

3
模拟用户定义的标量函数,其方式不会阻止并行性
我正在尝试查看是否存在一种诱使SQL Server对查询使用特定计划的方法。 1.环境 假设您有一些在不同进程之间共享的数据。因此,假设我们有一些实验结果需要很多空间。然后,对于每个过程,我们都知道要使用哪个年/月的实验结果。 if object_id('dbo.SharedData') is not null drop table SharedData create table dbo.SharedData ( experiment_year int, experiment_month int, rn int, calculated_number int, primary key (experiment_year, experiment_month, rn) ) go 现在,对于每个过程,我们都在表中保存了参数 if object_id('dbo.Params') is not null drop table dbo.Params create table dbo.Params ( session_id int, experiment_year int, experiment_month int, …

2
我可以重构该查询以使其并行运行吗?
我有一个查询,大约需要3个小时才能在我们的服务器上运行-而且没有利用并行处理。(中有约115万条记录dbo.Deidentified,其中有300条记录dbo.NamesMultiWord)。该服务器可以访问8个核心。 UPDATE dbo.Deidentified WITH (TABLOCK) SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml), DE461 = dbo.ReplaceMultiWord(DE461), DE87 = dbo.ReplaceMultiWord(DE87), DE15 = dbo.ReplaceMultiWord(DE15) WHERE InProcess = 1; 并且ReplaceMultiword是定义为: SELECT @body = REPLACE(@body,Names,Replacement) FROM dbo.NamesMultiWord ORDER BY [WordLength] DESC RETURN @body --NVARCHAR(MAX) 是否要求ReplaceMultiword阻止制定并行计划?有没有办法重写它以允许并行性? ReplaceMultiword 因为某些替代品是其他替代品的短版,所以它们以降序运行,我希望最长的替代品能够成功。 例如,可能有“乔治华盛顿大学”和“华盛顿大学”。如果首先是“华盛顿大学”比赛,那么“乔治”将被甩在后面。 从技术上讲,我可以使用CLR,但我不熟悉该如何使用。

2
为BULK INSERT配置不受约束的委托
我在Always On可用性组中有一对Microsoft SQL Server 2016节点。我正在尝试对BULK INSERTWindows Server 2016文件服务器故障转移群集上的文件执行(使用SQL Server 2016 Management Studio查询),但是出现以下错误: 消息4861,级别16,状态1 无法批量加载,因为无法打开文件“ \ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt”。操作系统错误代码5(访问被拒绝。)。 无论我使用活动节点名称(nas2.my.domain)还是故障转移群集侦听器(nas.my.domain),都会发生这种情况。 环顾四周后,我发现这是由于SQL Server无法模拟与我连接的用户帐户所致BULK INSERT。 如果使用Windows身份验证连接到SQL Server,则SQL Server服务帐户将在连接到文件服务器时尝试模拟您的用户帐户。如果使用SQL Server身份验证进行连接,它将以SQL Server服务帐户连接到文件服务器。 如果未正确配置委派和模拟(默认状态),则SQL Server服务将无法模拟您的用户帐户,并且将退回尝试以匿名用户身份连接到文件服务器。 可以通过查看文件服务器上的安全事件日志来确认。这些事实以及有关配置不受约束和受约束的委派的指南记录在以下链接中: 如何:约束委派的SQL Server批量插入(访问被拒绝) 批量插入和Kerberos 我已经尝试按照thesqldude指南中的说明进行操作,但是仍然无法正常工作。 我尝试访问的数据库BULK INSERT不是可用性组的一部分,因此只有MSSQL1节点才有意义。文件服务器在NAS2节点上处于活动状态。检查文件服务器上的事件日志确实表明它仍然遇到此问题,并且SQL Server尝试以匿名用户身份验证文件服务器,而不是模拟我的用户帐户。 有人知道出什么事了吗?还是为了使这些指南过时而在SQL Server 2016中进行了某些更改? 文件服务器安全事件日志条目 服务帐户委托 服务帐户SPN SQL …

1
查询存储强制计划功能不起作用
查询存储强制计划功能似乎没有执行该计划。 我知道查询存储-强制并不总是意味着强制;但是,我的计划可能不会发生重大变化,但是查询优化器可能会继续选择错误的索引,循环选择等。 基本上:它不符合我的强制计划选择。我强迫了许多计划,但没用。 当我查看时,有0个失败计数或原因sys.query_store_plan force_failure_count。 扩展事件query_store_plan_forcing_failed不会产生任何结果。0活动。 例如,一个计划在20.09开始实施。只有1次编译碰巧使用了强制计划。 这些计划大相径庭,一个计划与INDEX 1一起使用哈希匹配联接,另一个计划与INDEX 2一起使用循环联接。 版本:Microsoft SQL Server 2016(SP1-GDR)(KB3210089)-13.0.4202.2(X64) 我在这里想念什么?

3
创建表时如何添加默认约束?SQL Server [关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 3年前关闭。 我正在尝试创建一个新表,其中包含各列及其后的约束,如下所示。 Create tblTest( columns.. .. .. Gender int, Constraint DF_tblTest_Gender Default 3 For Gender, .. .. .. ) 但是,我在默认约束附近收到一条错误消息,因为, 'for'附近的语法不正确

1
为什么批处理模式窗口合计会产生算术溢出?
以下查询在具有SUM的列存储表上执行带窗口的窗口1500 total rows,每个表的值均为0或1,并且溢出INT数据类型。为什么会这样呢? SELECT a, p, s, v, m, n, SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition FROM ( SELECT a, p, s, v, m, n, RANK() OVER (PARTITION BY v, s, a, p ORDER BY …

1
为什么NOLOCK会使具有变量分配的扫描变慢?
在当前环境下,我正在与NOLOCK作战。我听到的一个论点是,锁定的开销会使查询变慢。因此,我设计了一个测试以查看此开销可能是多少。 我发现NOLOCK实际上减慢了我的扫描速度。 起初我很高兴,但是现在我很困惑。我的考试以某种方式无效吗?NOLOCK实际上不应该允许扫描速度稍快吗?这里发生了什么事? 这是我的脚本: USE TestDB GO --Create a five-million row table DROP TABLE IF EXISTS dbo.JustAnotherTable GO CREATE TABLE dbo.JustAnotherTable ( ID INT IDENTITY PRIMARY KEY, notID CHAR(5) NOT NULL ) INSERT dbo.JustAnotherTable SELECT TOP 5000000 'datas' FROM sys.all_objects a1 CROSS JOIN sys.all_objects a2 CROSS JOIN sys.all_objects a3 /********************************************/ …

4
SQL Server无法在简单双射上使用索引
这是另一个查询优化器难题。 也许我只是高估了查询优化器,或者我错过了一些东西,所以我把它放在了那儿。 我有一张简单的桌子 CREATE TABLE [dbo].[MyEntities]( [Id] [uniqueidentifier] NOT NULL, [Number] [int] NOT NULL, CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY CLUSTERED ([Id]) ) CREATE NONCLUSTERED INDEX [IX_Number] ON [dbo].[MyEntities] ([Number]) 带有一个索引和几千行,Number均匀分布在值0、1和2中。 现在这个查询: SELECT * FROM (SELECT [Extent1].[Number] AS [Number], CASE WHEN (0 = [Extent1].[Number]) THEN 'one' WHEN (1 = [Extent1].[Number]) THEN 'two' …


1
使用Join和Window函数获取超前和滞后值之间的性能比较
我有20M行的表,每一行有3列:time,id,和value。对于每个id和time,value状态为。我想知道的超前滞后一定的值,time为特定的id。 我使用了两种方法来实现此目的。一种方法是使用连接,另一种方法是使用窗口函数超前/滞后以及在time和上的聚集索引id。 我按执行时间比较了这两种方法的性能。join方法需要16.3秒,而window函数方法需要20秒,这不包括创建索引的时间。这使我感到惊讶,因为在join方法是蛮力的情况下,窗口功能似乎已被改进。 这是这两种方法的代码: 创建索引 create clustered index id_time on tab1 (id,time) 加盟方法 select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 on a1.id = b1.id and a1.time-1= b1.time left join tab1 c1 on a1.id = c1.id and a1.time+1 …

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%。对于相同的负载,我进行了并排比较。

1
SHRINKFILE失败-为什么增加文件大小可以解决?
我正在运行一些SHRINKFILE操作来清理文件组中的一堆微小的不必要文件。对于其中一种收缩,以下命令将导致错误: DBCC SHRINKFILE (N'myfile' , EMPTYFILE)' 无法缩小数据库ID x的文件ID x,因为它正在被另一个进程缩小或为空 它不是空的也不是收缩的。它正在除我以外的任何人当前未使用的数据库上运行。自动收缩功能未启用,也从未启用过。但是,如果真的很重要,在我开始使用该数据库之前,会定期对其进行手动收缩。 在SQLServerCentral上,十年前的一个线程建议在文件中添加一些MB,因为“重新设置内部计数器或开关会告诉它现在不在收缩中”。 这很有效-很棒。但是,谁能更详细地说明SQL Server内部的工作原理/原因?

1
EXCEPT运算符背后的算法是什么?
在SQL Server的幕后,Except运算符如何工作的内部算法是什么?是否在内部对每行进行哈希处理并进行比较? David Lozinksi进行了一项研究,即SQL:在尚不存在的新记录中插入新记录的最快方法。与下面的结果紧密相关。 假设:我认为Left join最快,因为它只比较1列,而Except花费的时间最长,因为它必须比较All列。 有了这些结果,现在我们的思维是“除了自动且内部对每一行进行哈希处理?”。我看了看执行计划,它确实利用了一些哈希。 背景:我们的团队正在比较两个堆表。表A将不在表B中的行插入到表B中。 堆表(来自旧文本文件系统)没有主键/向导/标识符。一些表具有重复的行,因此我们找到了每一行的哈希,并删除了重复项,并创建了主键标识符。 1)首先,我们运行一个except语句,排除(hash列) select * from TableA Except Select * from TableB, 2)然后我们在HashRowId的两个表之间进行左联接比较 select * FROM dbo.TableA A left join dbo.TableB B on A.RowHash = B.RowHash where B.Hash is null 令人惊讶的是,例外声明插入是最快的。 结果实际上与David Lozinksi的测试结果很接近

2
永不结束查询存储搜索
我从一开始说,我的问题/问题类似于此之前的一个,但因为我不知道的原因或起始信息是一样的,我决定后,我的问题有一些更多的细节。 当前问题: 在一个奇怪的时刻(工作日临近结束),生产实例开始出现异常行为: 实例的CPU较高(从约30%的基准开始,它增加了约一倍,并且仍在增长) 每秒增加的事务数(尽管应用程序负载未发生任何变化) 空闲会话数增加 从未显示此行为的会话之间发生奇怪的阻止事件(即使读取未提交的会话也导致了阻止) 等待间隔的最长时间是第一页上的非页面锁,第二名是锁 初步调查: 使用sp_whoIsActive,我们看到了由监视工具执行的查询决定运行速度非常慢,并占用大量CPU,这在以前是没有发生的。 隔离级别未提交; 我们查看了看到古怪数字的计划:StatementEstRows =“ 3.86846e + 010”,其中约150 TB的估计数据已返回 我们怀疑原因是监视工具的查询监视功能引起了,因此我们禁用了该功能(我们还与提供程序一起打开了一张票证,以检查他们是否知道任何问题) 从第一个事件开始,它又发生了几次,每次我们终止会话时,一切都恢复正常; 我们意识到查询极为相似的一个查询在BOL使用MS用于查询存储监测-查询,最近在性能倒退(在时间上比较不同点) 我们手动运行相同的查询并看到相同的行为(使用的CPU不断增加,闩锁等待时间增加,意外锁定等。) 有罪查询: Select qt.query_sql_text, q.query_id, qt.query_text_id, rs1.runtime_stats_id AS runtime_stats_id_1, interval_1 = DateAdd(minute, -(DateDiff(minute, getdate(), getutcdate())), rsi1.start_time), p1.plan_id AS plan_1, rs1.avg_duration AS avg_duration_1, rs2.avg_duration AS avg_duration_2, p2.plan_id AS plan_2, interval_2 = …

2
每一批都会导致编译
我们有一个第三方应用程序,它可以批量发送T-SQL语句。 该数据库托管在SQL Server 2016 Enterprise SP1 CU7、16核和256GB内存上。启用即席优化。 这是正在执行的查询的虚拟示例: exec sp_executesql N' IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT select field1, field2 from table1 where field1=@1 option(keep plan, keepfixed, loop join) select field3, field4 from table2 where field3=@1 option(keep plan, keepfixed, loop join)', N'@1 nvarchar(6)',@1=N'test' 当我监视数据库并查看批处理/秒和编译/秒时,我注意到它们始终相同。在高负载下,这可以是1000批/秒和1000编译/秒。在平均负载下,有150个批次/秒。 我分析了最近编译的计划的查询缓存: SELECT TOP …

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.