数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

1
测量计划驱逐
我们有一个SQL Server 2016 SP1,最大内存设置为24GB。 该服务器具有大量编译,其中只有10%的编译来自临时查询。因此,新编译的计划应存储在计划缓存中,但计划缓存的大小不会增加(约3.72GB)。 我怀疑本地内存压力会导致从缓存中删除计划。计划缓存压力限制为5GB。(0-4GB的可见目标内存的75%+ 4GB-64GB的可见目标内存的10%+> 64GB的可见目标内存的5%)。当缓存存储达到压力限制的75%时,应从缓存中删除计划。就我而言,5 GB的75%为3.75 GB。因此,这可能是高编译率的原因。 有没有一种方法可以测量(性能,扩展事件等)从缓存中删除计划?这样我就可以确定本地内存压力确实是高编译的原因吗?


1
如果系统健康中有“ sql_exit_invoked”,这意味着什么?
我的一台SQL Server 2016 Standard服务器遇到问题。我有8个生产服务器,这是唯一一台随机崩溃而日志中没有任何痕迹的服务器。 我已启用system_health。我注意到我在系统健康状况中有一行是“ sql_exit_invoked”。 我正在尝试在该行上找到更多信息。这是什么意思?我在互联网上发现的唯一信息是,它在调用SQLExit()时发生,并且仅在SQL 2012以后才记录。(msdn网站上的链接) 所以我的问题是:我应该担心在日志中看到这个吗?我只能在有问题的服务器上找到它,而在其他7个服务器上都找不到。(所有都是SQL Server 2016 Standard版) 有人可以给我更多信息吗?

1
统计资料全天随机消失/清空
我有一个SQL Server 2017(CU9)数据库,该数据库存在一些与性能相关的问题,我认为这与索引统计信息有关。在进行故障排除时,我发现统计信息尚未更新(这意味着DBCC SHOW_STATISTICS将返回所有NULL值)。 我在受影响的表上执行了UPDATE STATISTICS,并验证SHOW_STATISTICS昨天在4:00 PM返回了实际值。今天早上8:00 AM,统计信息再次为空(返回NULL值)。 客户端确实有安排在每天凌晨4:00运行的维护作业,该维护作业将为数据库重新索引,然后针对整个数据库执行sp_updatestats。我已经验证了使用探查器跟踪在4:00 AM更新统计信息。 我不知道为什么统计信息将为空,维护工作是否在4:00 AM运行?在此版本的SQL Server上是否存在我不知道的错误? 提前感谢你的帮助。 更多信息: 自动更新统计信息已启用。 “异步自动更新统计信息”已禁用。 自动创建增量统计信息已禁用。 重新编制索引脚本(混淆): USE DBNAME; DECLARE @CERTENG_Lock INT DECLARE @WebSite_Control_ProcessRunning_Lock INT DECLARE @WebSite_Control_Disabled_Lock INT DECLARE @LogMessage VARCHAR(1024) SELECT @CERTENG_Lock = Lock FROM application.CERTENG_Lock SELECT @WebSite_Control_Disabled_Lock = MAX(CAST(Disabled AS INT)), @WebSite_Control_ProcessRunning_Lock = MAX(CAST(ProcessRunning AS INT)) …

3
为协作距离有限的行分配唯一值的解决方案
我有一个可以使用以下代码创建和填充的表: CREATE TABLE dbo.Example(GroupKey int NOT NULL, RecordKey varchar(12) NOT NULL); ALTER TABLE dbo.Example ADD CONSTRAINT iExample PRIMARY KEY CLUSTERED(GroupKey ASC, RecordKey ASC); INSERT INTO dbo.Example(GroupKey, RecordKey) VALUES (1, 'Archimedes'), (1, 'Newton'), (1, 'Euler'), (2, 'Euler'), (2, 'Gauss'), (3, 'Gauss'), (3, 'Poincaré'), (4, 'Ramanujan'), (5, 'Neumann'), (5, 'Grothendieck'), (6, 'Grothendieck'), …

1
SELECT查询上的算术溢出
我在一个简单的SELECT语句中遇到了算术溢出。查询如下 SELECT [SaleValue] FROM Sales [SaleValue]是数据类型,decimal(9,0)而不是计算列。 发生这种情况的原因是,由于某种原因,该列在该字段存储的行大于指定的数据类型(例如)decimal(10,0)。 当我增加列的大小时,我只能使选择工作。所讨论的表在其他两个列和行中还有两个其他实例。 这种情况怎么可能?首先,如何将超出范围的值保存在列中? 我正在使用Microsoft SQL Server,这是一个基表,而不是视图。

2
升级到更好的存储后,检查点的等待时间增加
当我们从一个较早的全闪存阵列迁移到一个较新的全闪存阵列(不同但信誉良好的供应商)时,我们开始发现检查点期间SQL Sentry中的等待时间增加了。 版本:SQL Server 2012 Sp4 在我们的旧存储中,检查点期间的等待时间约为2k,“峰值”为2500,而在新存储中,峰值通常为10k,峰值接近50k。哨兵将我们更多地指向PAGEIOLATCH瓦蒂斯。做我们自己的分析,似乎是PAGEIOLATCH and PAGELATCH等待的组合。使用Perfmon,我们通常可以说检查点的页面越多,等待的时间就越多,但是在检查点期间我们只刷新了约125 mb。我们的工作量主要是写操作(主要是插入/更新)。 存储供应商向我们证明,在这些检查点事件期间,光纤通道直接连接的阵列在1毫秒内响应。HBA还确认阵列的编号。我们也不认为这是HBA排队的问题,因为队列深度从未超过8。我们还尝试了更新的HBA,将ZIO,执行限制和队列深度设置更改为无效。我们还将服务器的内存从500 GB增加到1 TB,没有任何变化。在检查点过程中,我们确实看到2-4个核心(共16个)峰值达到100%,但总体CPU约为20%。BIOS也设置为高性能。但是有趣的是,即使禁用了CPU,我们也确实看到它们通常处于C2睡眠状态,因此我们仍在研究为何睡眠状态超过C1。 我们可以看到,几乎所有等待都在数据页面上,偶尔的PFS为DCM页面类型。等待在用户数据库中,而不在tempdb中。我们还看到,等待是在多个数据页面上进行的,其中一些SPID在同一页面上等待。数据库设计确实有几个插入热点,但是旧存储采用了相同的设计。 运行此查询循环100次,我们能够捕获正在磁盘与内存上等待的SPID数量 SELECT [owt].[wait_type], count(*) as waitcount FROM sys.dm_os_waiting_tasks [owt] WHERE [owt].[wait_type] LIKE 'PAGE%' group by [owt].[wait_type] order by 1 GO 100 “好”的事情是,我们可以在具有相同模型阵列和相似服务器规格的性能环境中轻松重现该问题。对于任何其他地方或如何缩小问题的想法,我将不胜感激。现在,我们的下一个测试包括:带有更新的主板和更多CPU的新服务器;禁用SIOS数据保持器(即使旧存储中已安装该功能);不同的HBA品牌。 exec sp_Blitz @outputtype = 'markdown' 优先级5:可靠性:-危险的第三方模块-Sophos Limited-Sophos缓冲区溢出保护-SOPHOS〜2.DLL-已安装可疑的危险第三方模块。 优先级200:信息性:-群集节点-这是群集中的节点。-TraceFlag On-跟踪标记1117全局启用。-跟踪标记1118全局启用。-跟踪标记3226全局启用。 优先级200:许可:-正在使用的企业版功能* xxxxx-[xxxxxx]数据库正在使用压缩。如果将此数据库还原到Standard Edition Server上,则还原将在2016 SP1之前的版本上失败。* …

1
指数寻求运营商成本
对于下面的AdventureWorks示例数据库查询: SELECT P.ProductID, CA.TransactionID FROM Production.Product AS P CROSS APPLY ( SELECT TOP (1) TH.TransactionID FROM Production.TransactionHistory AS TH WHERE TH.ProductID = P.ProductID ORDER BY TH.TransactionID DESC ) AS CA; 执行计划显示针对Index Seek的估计运营商成本为0.0850383(93%): 成本与使用的基数估计模型无关。 这不是“ 估计的CPU成本”和“ 估计的I / O成本”的简单相加。一次执行索引搜索的成本也不乘以估计的执行次数。 这个费用数字是如何得出的?

2
什么是孤儿化身?
在本网站上对另一个问题的回答中,对麻省进行了解释。答案提到“孤儿”的化身: …还有其他因素导致ORPHANED化身和过时的备份… 我看到从Oracle的文档其V$DATABASE_INCARNATION包括STATUS列,其可以具有的值ORPHAN,CURRENT或者PARENT,必须是相关的。 什么是“孤立的”化身,以及哪些步骤将导致带有STATUS= ORPHANin 的行V$DATABASE_INCARNATION?

3
可以删除MSDB吗?
我不是DBA,我只是用谷歌搜索MSDB所做的事情,基本上它是其工作和历史记录的SQL Agent数据库,现在我的云服务器空间不足,并且我有1年的MSDB值,可以删除它还是保留它作备份之用? 我的MSDB在250GB硬盘中为93GB。

3
如何选择组中每列的最后一个非NULL值集?
我正在使用SQL Server 2016,并且正在使用的数据具有以下形式。 CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1)); INSERT INTO #tab VALUES ('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL), ('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL); SELECT * FROM #tab; 我想要获取列上最后的非空值,val1并按进行val2分组cat和排序t。我正在寻找的结果是 cat val1 val2 A 1 P B 10 C 我所使用的最接近的是正在使用的,LAST_VALUE而忽略了ORDER BY那将不起作用,因为我需要排序的最后一个非空值。 SELECT DISTINCT cat, LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1, …

5
Ola的脚本与使用维护计划的利弊是什么?
您能否帮助我了解在维护计划中使用Ola解决方案的利弊?我已经准备了一个基于SQL Pass的演示文稿(http://www.pass.org/DownloadFile.aspx?File=ebae1b31)。 我还准备了Ola解决方案无法解决的方案和维护计划解决方案所无法解决的方案。能否请大家帮我更详细地解释一下? 顺便说一下,我们管理着至少150%的服务器(2008/2012/2014/2016混合服务器),其中至少有75%使用Ola的解决方案。我喜欢Brent Ozar的这篇文章。但在评论中,Brent建议针对我们拥有的服务器数量使用基于脚本的解决方案。https://www.brentozar.com/archive/2012/04/maintenance-plans-roombas-suck-good-way/

3
非聚集索引是否对行顺序有任何保证?
我有一个开发人员希望在不按顺序执行select语句时,将表中的行按插入的顺序排列。开发人员建议从聚簇索引更改为非聚簇索引。 通过将索引从聚集索引更改为非聚集索引,这是否可以保证表中行的出现顺序? 这个问题主要是出于我的好奇心。我将建议改用Identity列,但是这个请求让我开始思考。可以使用时间戳,但是有可能同时插入行。 在此先感谢您的帮助。

2
MySQL-不同月份的最大总和与多年的联系
对此问题予以启发这一个(闭合)和几乎是相同的这一个,但使用不同的RDBMS(PostgreSQL的对比的MySQL)。 假设我有一个肿瘤列表(此数据是根据真实数据模拟得出的): CREATE table illness (nature_of_illness VARCHAR(25), created_at DATETIME); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40'); INSERT INTO illness VALUES ('Lung', '2018-01-03 …
9 mysql-5.6 

2
连接到本地主机时,SMO,SSMS对于在Docker中管理SQL Server的速度很慢
TL; DR:当通过可解析为IPv6环回(::1)的名称连接到我的SQL Server Docker容器时,SMO调用确实很慢。使用时127.0.0.1,速度很快。 我正在尝试学习如何使用Docker镜像microsoft / mssql-server-windows-developer。根据Microsoft的文档,此容器仅公开端口1433 TCP。 docker run -d -p 1433:1433 -e sa_password=Passw0rd! -e ACCEPT_EULA=Y -v C:\dockerdb:C:\dockerdb microsoft/mssql-server-windows-developer 我正在Windows 10上运行该容器,并且已成功启动该容器,使用SQL Server身份验证进行身份验证,并在Windows主机上使用sqlcmd和SSMS 17.4对实例运行查询(连接到localhost或“。”),以及SQL操作通过IP连接的隔壁Mac上的Studio。这样运行查询时,我看不到任何明显的性能问题。 在SSMS中,我也可以浏览对象资源管理器,但是如果尝试从对象资源管理器中的对象的右键菜单上执行某些操作,例如打开实例参数窗口或附加数据库,则SSMS不会显示约5的响应-10分钟,此时它要么显示我要的窗口,要么显示以下错误消息: 我还尝试使用SMO Scripter对象针对此实例进行一些PowerShell脚本编写,并看到相同的行为。PS脚本循环遍历数据库中的对象并将其脚本化为文件,并且可以相对较快地收集对象列表,但是每个单独的对象需要5-10分钟的时间来编写脚本-太慢了,无法使用。 我有一个预感,即单个暴露的端口还不够,SMO和SSMS试图以类似的方式进行连接,这会使它们变慢。难道是当连接到本地主机时,这些工具是否假定存在其他通常不会进行防火墙保护的通信通道?我可以使用其他任何连接参数吗?谁能验证我关于SSMS正在使用SMO或其他与SQL Server通信的假设? 更新:我仍在调查,但这似乎是围绕资源限制的Docker问题。这很令人困惑,因为大多数文档似乎都表明Windows容器没有任何默认资源限制(并且不能在Docker for Windows GUI中设置这些默认资源限制- 仅对于Linux容器),但是实际上,Windows在Windows 10上运行的容器的默认RAM分配为1GB。我仍在尝试找出如何检查正在运行的容器以查看其RAM和CPU分配的方法,但是接下来我必须尝试使用docker run参数从默认值中增加这些值。 进一步更新:我一直无法从docker获得任何可靠的指标,该指标可以告诉我该容器对CPU和内存的限制。各种研究表明,docker容器默认没有内存限制,或者它们有1GB,但是我目前只能验证的是,docker stats该SQL容器仅使用 750到850兆之间,何时我尝试添加一个运行参数来将可用内存设置为4 GB,但出现错误。因此,我不再关注该查询线程,而是进行了另一项肠道检查:在正在运行的容器上进入交互式Powershell会话,然后从容器内部调用上面链接的Powershell脚本。 在容器内运行没有问题。它在短短几分钟内就烧穿了2780个物体。我认为这可以确认问题出在容器/主机边界上,因此我将看看是否可以打开该UDP端口。更新:打开端口1434 UDP没有帮助。 更多更新-已解决,而不是资源约束问题:似乎与为Windows容器设置大的内存分配有关的问题 -我在3g和2g上收到类似的错误,但最终能够从1.5g启动该容器,并且我发现docker stats容器的差异(我认为)证实了容器运行时的默认分配为1GB。在默认设置下,PRIV WORKING SET stat(我找不到任何文档,但我最大的猜测是它的RAM)在700MiB和850MiB之间。用docker run —memory="1.5g"设置,大约是1.0GiB。因此,它的确扩大了,但似乎腾出了比以前更多的分配空间。我将此解释(可能是错误地)是指该服务器(绝对没有负载运行并且没有用户数据库)没有内存压力。我检查了最大服务器内存设置,以确认它设置为默认的最大2PiB。 …

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.