Questions tagged «sql-server-2016»

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

2
SQL Server 2016 vs 2012插入性能
我在同一台服务器上有两个SQL Server实例: Microsoft SQL Server 2012(SP1)-11.0.3000.0(X64)标准版(64位) Microsoft SQL Server 2016(SP1-CU5)(KB4040714)-13.0.4451.0(X64)企业版(64位) 两个实例上的sp_configure结果相同(新的2016选项除外)。 我已经在同一磁盘文件夹上的两个实例上创建了新数据库。自动增长参数是相同的。 自动创建和自动更新统计信息选项已关闭。 然后,我对堆中的10000个插入进行了测试: set nocount on go create table dbo.TestInsert ( i int not null, s varchar(50) not null ) declare @d1 datetime, @d2 datetime, @i int set @d1 = getdate() set @i = 1 while @i <= 10000 …

2
SQL Server 2016的奇怪性能问题
我们在VMware虚拟机中运行SQL Server 2016 SP1的单个实例。它包含4个数据库,每个数据库用于一个不同的应用程序。这些应用程序都位于单独的虚拟服务器上。它们都没有在生产中使用。但是,测试应用程序的人员正在报告性能问题。 这些是服务器的统计信息: 128 GB RAM(SQL Server最大110GB内存) 4核@ 4.6 GHz 10 GBit网络连接 所有存储均基于SSD 程序文件,日志文件,数据库文件和tempdb位于服务器的单独分区上 阿斯 用户正在通过基于C ++的ERP应用程序执行单屏访问。 当我ostress使用许多小型查询或大型查询对Microsoft的SQL Server进行压力测试时,我将获得最佳性能。唯一的限制是客户,因为他不能足够快地回答。 但是,当几乎没有用户时,SQL Server几乎什么也不做。然而,人们必须永远等待以保存应用程序中的所有内容。 根据Paul Randal的“ 告诉我哪里疼 ”查询,所有等待事件中有50%是ASYNC_NETWORK_IO。 这可能意味着网络问题,或者应用程序服务器或客户端的性能问题。这些都无法最大程度地远程使用其资源。大多数情况下,所有计算机(客户端,应用服务器,数据库服务器)上的CPU大约占26%。 网络连接的延迟约为1-3ms。在正常使用该应用程序期间,数据库服务器的IO最高写入速度为20MB / s(平均为7-9MB / s)。当我进行压力测试时,最高速度达到5GB / s。 对于我们的ERP系统数据库,缓冲区高速缓存大小为60GB,对于我们的财务软件,为20GB,对于质量保证软件,为1GB,对于文档归档系统,为3GB。 我授予了SQL Server帐户使用即时文件初始化的权利。丝毫没有提高性能。 在正常使用期间,页面预期寿命约为15k +。在预期的重压力测试结束时,该值下降至.05k左右。批处理/秒约为2-8k,具体取决于工作负载。 我会说ERP应用程序写得不好,但是我不能,因为所有应用程序都受影响。即使工作量最少。 但是我无法查明是什么原因造成的。是否有任何提示,提示教程,应用程序,最佳/最差实践文档或其他有关此问题的想法? 这些是来自的结果sp_BlitzFirst: 我跑了600秒。我在工作量很大的应用程序中启动了它。是1/3的时间ASYNC_NETWORK_IO。我还测试与网络连接NTttcp,PsPing,ipferf3,和pathping。没什么不寻常的。响应时间最大3毫秒,平均0.3毫秒。吞吐量约为1000 MB / s。 我的调查总是导致ASYNC_NETWORK_IOwaitstat排名第一。 我们调查了Large-Receive-Offload在VMware 中禁用该功能的结果。我们仍在测试中,但结果似乎不一致。我们的第一个“基准测试”持续了19分钟(最高结果是13分钟,只有当应用程序在具有SQL …

1
扩展事件允许的最大绑定动作数是多少?
如果在事件会话中向事件添加“太多”操作,则会收到此错误: 消息25639,级别16,状态23,第1行该事件“ [事件名称]”超出了允许的绑定操作数。 允许多少动作?它会因事件而变化吗? 根据实验,答案似乎是27 sqlserver.rpc_completed。但是我在任何Microsoft文档中都没有找到这个数字。而且似乎因事件而异,因为我能够获得30分sqlserver.sql_batch_completed。 失败的示例代码: CREATE EVENT SESSION [Test] ON SERVER ADD EVENT sqlserver.rpc_completed( ACTION( package0.callstack, package0.collect_cpu_cycle_time, package0.collect_current_thread_id, package0.collect_system_time, package0.event_sequence, package0.last_error, package0.process_id, sqlos.cpu_id, sqlos.numa_node_id, sqlos.scheduler_address, sqlos.scheduler_id, sqlos.system_thread_id, sqlos.task_address, sqlos.task_elapsed_quantum, sqlos.task_resource_group_id, sqlos.task_resource_pool_id, sqlos.task_time, sqlos.worker_address, sqlserver.client_app_name, sqlserver.client_connection_id, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.context_info, sqlserver.database_id, sqlserver.database_name, sqlserver.is_system, sqlserver.nt_username, sqlserver.plan_handle)) GO DROP EVENT SESSION [Test] …


2
显示估计的执行计划会生成CXPACKET,PAGELATCH_SH和LATCH_EX [ACCESS_METHODS_DATASET_PARENT]等待
我在4个vCPU VM运行Microsoft SQL Server 2016 SP2-CU6(13.0.5292.0)与max degree of parallelism设置为2和cost threshold for parallelism设置为50。 早晨,当尝试显示SELECT TOP 100查询的估计执行计划时,我遇到了大量的等待,渲染估计计划的操作需要花费几分钟,通常是5到7分钟。同样,这不是查询的实际执行,这只是显示“ 估计的执行计划”的过程。 sp_WhoIsActive将显示PAGEIOLATCH_SH等待或LATCH_EX [ACCESS_METHODS_DATASET_PARENT]等待,当我在操作期间运行Paul Randal的WaitingTasks.sql脚本时,它将显示CXPACKET等待,而工作线程显示PAGEIOLATCH_SH等待: *资源描述字段= exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen 工作线程看起来是将整个stats表都放入内存中(因为从Paul Randal的查询中显示的那些页号以及后续页号都指向该stats表的集群键)。一旦计划恢复,即使在stats剩余的各种记录(我认为由于类似查询的查找操作而将其拉出)的情况​​下,大部分缓存都从高速缓存中消失之后,一天中的剩余时间基本上都是瞬时的。 如果查询实际上是使用SCAN运算符的计划执行的,我会期望出现这种初始行为,但是为什么在评估执行计划时才这样做(如上面链接的计划所示),以达到SEEK运算符呢?我该怎么办(除了在办公时间之前运行此语句,以便适当地缓存我的数据),以帮助提高此处的性能?我假设一对覆盖索引将是有益的,但是它们真的可以保证行为的任何改变吗?我必须在这里在一些存储和维护窗口限制内工作,并且查询本身是从供应商解决方案生成的,因此,此时欢迎任何其他建议(除了更好的索引编制)。

2
内部联接的基数估计问题
我正在努力理解为什么行估计是如此严重的错误,这是我的情况: 简单连接-使用SQL Server 2016 sp2(在sp1上存在相同问题),dbcompatiblity = 130。 select Amount_TransactionCurrency_id, CurrencyShareds.id from CurrencyShareds INNER JOIN annexes ON Amount_TransactionCurrency_id = CurrencyShareds.Id option (QUERYTRACEON 3604, QUERYTRACEON 2363); SQL估计1行,而SQL为107131,并选择做一个嵌套循环(链接到plan)。在CurrencyShareds上更新统计信息之后,估算就可以了,并选择了合并联接(链接到新计划)。一旦仅将一条记录添加到CurrencyShareds,统计信息就会“过时”,并且sql返回错误的估计。 我不太担心这个简单的查询,但这只是一个更大的查询的一部分,而这就是多米诺骨牌的开始... 为什么在100条记录表中添加一行会造成这种损坏?查看基数估计跟踪的输出时,我看到此警告,***WARNING: badly-formed histogram ***但在此主题上找不到更多信息。 这是基数估计的全部输出: Begin selectivity computation Input tree: LogOp_Join CStCollBaseTable(ID=1, CARD=107131 TBL: annexes) CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds) ScaOp_Comp x_cmpEq ScaOp_Identifier QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id …

2
DBCC FREEPROCCACHE或DBCC FREESYSTEMCACHE('SQL Plans')都不执行任何操作来释放CACHESTORE_SQLCP内存
CACHESTORE_SQLCP几天后,SQL计划占用超过38 GB的内存。 我们已经在运行“优化临时工作负载”选项。(实体框架和自定义报告会产生很多特殊条件!) 具有多可用区镜像的AWS RDS上的SQL Server 2016 SE 3.00.2164.0.v1 当我跑步时: DBCC FREESYSTEMCACHE('SQL Plans'); 要么 DBCC FREEPROCCACHE 要么 DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL 要么 DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL; 它似乎无法清除: SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb desc type name pages_kb CACHESTORE_SQLCP SQL Plans 38321048 我在启用查询存储的情况下运行,但是我禁用了它以查看是否有任何干扰,这似乎没有帮助,但我将其保留了下来。 …


3
克服LIKE字符长度限制
通过阅读这里的LIKE字符长度限制,看起来我在LIKE子句中发送的文本长度不能超过4000个字符。 我正在尝试从特定查询的查询计划缓存中获取查询计划。 SELECT * FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?' 如果其中的查询LIKE超过4000个字符,那么即使我的查询在缓存计划中,我也会得到0个结果。(我期待至少是错误)。 有没有办法解决此问题或采取其他措施?我的查询长度可能超过了>个10000字符,看起来好像无法使用来查找它们LIKE。

2
为什么丢弃外键要花很长时间?
我制作了一个脚本,可以一次删除一个数据库中的所有外键,就像这样: ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2 令我惊讶的是,该脚本花费的时间很长:每个DROP FK平均需要20秒。现在,我知道创建FK可能是一件大事,因为服务器必须去检查FK约束是否从一开始就没有受到侵犯,而是放弃了?服务器删除需要很长时间的FK时会做什么?这既出于我自己的好奇心,又是为了了解是否有一种使事情更快的方法。能够删除FK(而不仅仅是禁用它们)可以使我在迁移过程中更快,从而最大程度地减少停机时间。

2
SQL Server 2016中用于空间数据的MakeValid()的替代方法
我有一张非常大的地理LINESTRING数据表,我正在从Oracle迁移到SQL Server。在Oracle中有许多针对此数据执行的评估,并且也需要针对SQL Server中的数据执行评估。 问题是:SQL Server对有效的要求LINESTRING比对Oracle的要求严格;“ LineString实例不能在两个或多个连续点的间隔内重叠”。 碰巧的是,我们LINESTRING的某个百分比不符合该标准,这意味着我们需要评估数据的功能会失败。我需要调整数据,以便可以在SQL Server中成功对其进行验证。 例如: 验证一个非常简单的方法LINESTRING,使其自身加倍: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).IsValidDetailed() 24413: Not valid because of two overlapping edges in curve (1). MakeValid针对它执行功能: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).MakeValid().STAsText() LINESTRING (0 -0.999999999999867, 0 …

1
对SQL Server 2016中包含SUBSTRING()的谓词的估计值的更改吗?
是否有任何有关SQL Server 2016更改的文档或研究,以了解如何估计包含SUBSTRING()或其他字符串函数的谓词的基数? 我要问的原因是我正在查看一个在兼容模式130下性能下降的查询,原因与与包含调用SUBSTRING()的WHERE子句匹配的行数估计值的更改有关。我已通过查询重写纠正了此问题,但我想知道是否有人知道SQL Server 2016中有关此区域更改的任何文档。 演示代码如下。在此测试用例中,估计值非常接近,但准确性取决于数据。 在测试用例中,在兼容级别120中,SQL Server似乎正在使用直方图进行估计,而在兼容级别130中,SQL Server似乎假定表中有固定的10%匹配。 CREATE DATABASE MyStringTestDB; GO USE MyStringTestDB; GO DROP TABLE IF EXISTS dbo.StringTest; CREATE TABLE dbo.StringTest ( [TheString] varchar(15) ); GO INSERT INTO dbo.StringTest VALUES ( 'Y5_CLV' ); INSERT INTO dbo.StringTest VALUES ( 'Y5_EG3' ); INSERT INTO dbo.StringTest VALUES ( 'ZY_NE' …

1
未使用的NONCLUSTERED INDEX仍然可以提高查询速度吗?
这是一种奇怪的情况,但我希望有人能回答。 在进行一些性能问题排查期间,我们按照的要求将NONCLUSTERED INDEX添加到了表中sp_BlitzIndex。第二天,我们检查了它的使用情况,结果显示0次读取(0次扫描/搜索,0次单例查找),因此我们将其禁用。 在第二分钟,我们收到了抱怨应用程序缓慢(性能问题)的投诉,这是我们在添加INDEX时首先尝试检查并解决的问题。 现在,从理论上讲,这听起来纯属巧合。可证明,可衡量的是,未使用 INDEX 。禁用它不会导致查询性能下降。但它几乎TOO巧合。 题 因此,我的问题就很简单了: 它是在所有可能的,一个非聚集索引,其使用提供的统计(从动态管理视图/ sp_BlitzIndex)显示NO使用,还是已经帮助受影响的表以某种方式查询性能?

6
操作系统返回错误21(设备未准备好。)
每次重新启动Windows时,对于某些数据库,都会出现此错误: 操作系统返回错误21(设备未准备好。) 我检查了磁盘chkdsk /r-没有坏扇区。 我执行DBCC CHECKDB没有错误: *(CHECKDB found 0 allocation errors and 0 consistency errors in database)* 如果我重新启动SQL Server,错误将消失。 Windows 10和SQL Server 2016 Express。

1
SQL扩展事件会话,用于死锁检测
有没有办法增加<inputbuf>死锁扩展事件会话捕获的死锁XML中元素的大小? 我们希望看到完整的查询,以帮助在应用程序代码中查明问题。 似乎仅限于1024个字符+/-。可以增加吗? 请参阅下面的XML示例。您可以看到<inputbuf>元素的查询文本在选择列表的中间被截断了: <deadlock> <victim-list> <victimProcess id="processc9c0829848" /> </victim-list> <process-list> <process id="processc9c0829848" taskpriority="0" logused="0" waitresource="PAGE: 5:1:40600276 " waittime="696" ownerId="255115931225" transactionname="SELECT" lasttranstarted="2019-04-24T09:29:25.950" XDES="0xc8dfa8da40" lockMode="S" schedulerid="13" kpid="8480" status="suspended" spid="245" sbid="2" ecid="0" priority="0" trancount="0" lastbatchstarted="2019-04-24T09:29:25.950" lastbatchcompleted="2019-04-24T09:29:25.950" lastattention="1900-01-01T00:00:00.950" clientapp="EntityFramework" hostname="MSR-PRD-BDB02" hostpid="43440" loginname="IUSR_BuildDB" isolationlevel="read committed (2)" xactid="255115931225" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> <executionStack> <frame procname="adhoc" …

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.