数据库管理员

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

2
在INSERT语句的OUTPUT INTO子句中使用源列(SQL Server)
我正在编写一个批处理插入语句,并且想使用一个临时表来跟踪插入的ID,而不是自己遍历项目并为每个插入的行调用SCOPE_IDENTITY()。 需要插入的数据具有(临时)ID将其链接到也应该插入另一个表中的其他数据,因此我需要实际ID和临时ID的交叉引用。 这是到目前为止我所拥有的一个例子: -- The existing table DECLARE @MyTable TABLE (ID INT IDENTITY(1,1), [Name] NVARCHAR(MAX)); -- My data I want to insert DECLARE @MyInsertData TABLE (ID INT, [Name] NVARCHAR(MAX)); INSERT INTO @MyInsertData ( ID,Name) VALUES ( -1 , 'bla'),(-2,'test'),(-3,'last'); DECLARE @MyCrossRef TABLE ([NewId] INT, OldId INT); INSERT INTO @MyTable ( …

2
证书链是由不可信的机构颁发的
前段时间,我在Windows 10家庭版环境(准确地说是笔记本电脑)上安装了SQL Server 2016开发人员版,一切都很好。 然后有人-盒子上的管理员-决定不告诉我,就重命名了该盒子。 之后,当尝试连接到SQL Server时,我们一直遇到以下错误消息: 这是与此非常类似的问题: 从Azure网站连接VM Role中的数据库时,“证书链由不可信的机构颁发” 我也来过这里: 目标主体名称不正确。无法生成SSPI上下文。(Microsoft SQL Server,错误:0) 我一直在使用Kerberos配置管理器,它给了我不同的错误消息 我应该说我能够通过SQL Server身份验证连接到该SQL Server实例,但是我想使用Windows身份验证进行连接。 只是要清楚-这都是本地计算机,不属于任何域。 我不太确定如何从这里开始,我想要使用Windows身份验证。 与证书有关的错误消息使我考虑在这里重新颁发证书。我不确定如何完成此任务,或者这是否是解决此问题的有效方法。 我今天不会在这台机器旁,但我会尽快赶上。如果时间允许,我将继续进行研究。



1
从非sysadmin域用户拥有的SQL Agent作业中运行SSIS包
我有两个SSIS程序包,它们作为大型SSIS部署的一部分,在夜间(通过SQL Server代理)按计划运行,没有任何问题。一切都使用Windows身份验证,并且计划的作业由sysadmin(我,我)拥有,并作为 SQL Server代理服务帐户运行。 因此,数据实际上是source system ~> transit db ~> staging ~> NDS通宵达旦的。 我关心的两个SSIS包分别针对一组特定的数据处理transit db ~> staging和staging ~> NDS部分。 域用户(非sysadmin)在中执行某项操作source system,并将感兴趣的数据推入transit db,因此我需要一种在工作时间内获取此更新数据以更新的方法NDS:决定了此人触发的最简单方法通过单击已启用宏的Excel工作簿中的按钮来表示该ETL,该工作簿通过ODBC(使用Windows身份验证)连接到SQL Server并执行存储过程。 存储过程如下所示: create procedure dbo.UpdateMaterialInventory as begin execute msdb.dbo.UpdateMaterialInventory; end [msdb]中的“姐妹”存储过程如下所示: create procedure dbo.UpdateMaterialInventory with execute as 'SqlAgentProxy' as begin execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory'; end 此[SqlAgentProxy]用户是我在域用户登录名[msdb]中创建的Windows用户,我已向其授予execute此UpdateMaterialInventory过程的权限。这避免了必须向域用户execute授予msdb.dbo.sp_start_job过多的权限。 SQL Agent作业NDS-ManualMaterialInventory由域用户拥有,并具有2个步骤,每个步骤的类型为[SQL Server …

1
资源池“内部”中没有足够的系统内存来运行此查询
我们的其中一台生产服务器正在报告日志中的错误 错误:701,严重性:17,状态:123 。资源池“内部”中没有足够的系统内存来运行此查询。 我搜索了此错误,发现它是一个错误,并且Service Pack 2有一个热修复程序。这些是服务器的详细信息: Microsoft SQL Server 2008 R2(SP2)-10.50.4000.0标准版(64位) 处理器数量:24(具有2个NUMA节点,每个节点具有12个内核) 内存:为SQL Server分配了24GB RAM。 查询批量/分钟:5000+ 我的问题是 为什么会出现此错误? 这是一个严重的问题吗? 我们该如何解决? 编辑内存状态: MEMORYBROKER_FOR_RESERVE (internal) Pages ---------------------------------------- ---------- Allocations 200362 Rate 4510 Target Allocations 200362 Future Allocations 588626 Overall 2521497 Last Notification 0 MEMORYBROKER_FOR_STEAL (internal) Pages ---------------------------------------- ---------- Allocations 431548 Rate 1973 …

4
SQL Server何时引入了残缺页面检测和校验和,升级行为是什么?
现代SQL Server中有两种不同的页面验证选项:被撕页检测和校验和。当然也没有选择。 我相信Checksum是在SQL Server 2005中引入的,并且从早期版本升级或还原数据库将保持其先前的页面验证方法。即没有隐式升级。 涉及的问题是我们有一个使用SQL Server 2000投入生产的生产数据库,此后已移至SQL Server 2008 R2服务器。当我期望将其作为“ 残缺页面检测”时,“ 页面验证”设置为“ 无”。回顾这段时间,我们似乎认为该数据库最初是在SQL Server 7.0中开发的,然后又迁移到SQL Server 2000,这也许可以解释观察到的结果。 我想知道“ 残缺页检测”和“ 校验和”何时成为SQL Server的功能,以及它们在迁移或升级到较新版本时的行为。 编辑:总结一些答案: 关于“残缺页面检测”进入SQL Server的某些日期存在一些差异。 链接1:http : //support.microsoft.com/kb/230785链接2:http : //technet.microsoft.com/en-us/library/aa337525(v=sql.90).aspx 第一个链接指示SQL 7.0,第二个链接指示SQL2000。我倾向于相信SQL7.0的建议,并且由于在SQL7.0中默认关闭和在SQL2000中默认打开而对链接2感到困惑。
15 sql-server 

1
哪些成本因素进入优化器,以选择不同类型的线轴?
线轴 在SQL Server中,有几种类型的线轴。我感兴趣的两个是Table Spool和Index spool,它们在修改查询之外。 只读查询(尤其是在嵌套循环联接的内侧)可以使用表或索引假脱机来潜在地减少I / O并提高查询性能。这些线轴可以是Eager或Lazy。就像你我一样。 我的问题是: 哪些因素影响表与索引假脱机的选择 哪些因素构成了热切线轴和惰性线轴之间的选择

5
如何将1毫秒添加到日期时间字符串?
基于选择,我可以返回x行,如下所示: 1 2019-07-23 10:14:04.000 1 2019-07-23 10:14:11.000 2 2019-07-23 10:45:32.000 1 2019-07-23 10:45:33.000 我们所有的毫秒都为0。 有没有一种方法可以将1乘以1毫秒,因此选择如下所示: 1 2019-07-23 10:14:04.001 1 2019-07-23 10:14:11.002 2 2019-07-23 10:45:32.003 1 2019-07-23 10:45:33.004 我正在尝试创建一个游标甚至没有成功的更新。 这是获取我想要的结果的查询: select top 10 ModifiedOn from [SCHEMA].[dbo].[TABLE] where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59' 有81k值。该字段是DATETIME。

1
OLAP和OLTP中的“在线”到底是什么?
我有点困惑,因为我质疑OLTP和OLAP中“在线”的定义。我以前认为这里的“在线”是指我们希望在有限的时间内并根据某个实例在时间上可用的数据来回答问题。 但是OLAP查询可能要花几个小时才能计算出来-这不是离线吗? 快速搜索表明离线OLAP听起来很混乱(离线在线分析处理)...? 什么是“在线”?

5
尝试回收未使用的空间会导致已用空间在SQL Server中显着增加
我在生产数据库中有一个表,该表的大小为525 GB,其中383 GB未使用: 我想回收一些空间,但是在弄乱生产数据库之前,我正在用较少数据的测试数据库中的同一表上测试一些策略。该表有一个类似的问题: 有关表的一些信息: 填充因子设置为0 大约有30列 列之一是图像类型的LOB,它存储的文件大小从几KB到几百MB不等 该表没有任何与之相关的假设索引 服务器正在运行SQL Server 2017(RTM-GDR)(KB4505224)-14.0.2027.2(X64)。数据库正在使用SIMPLE恢复模型。 我尝试过的一些事情: 重建索引: ALTER INDEX ALL ON dbo.MyTable REBUILD。这产生的影响可以忽略不计。 重组索引:ALTER INDEX ALL ON dbo.MyTable REORGANIZE WITH(LOB_COMPACTION = ON)。这产生的影响可以忽略不计。 将LOB列复制到另一个表,删除该列,重新创建该列,然后将数据复制回(如本文章中概述的:释放未使用的空间SQL Server表)。这减少了未使用的空间,但似乎只是将其转换为已用空间: 使用了bcp实用程序来导出表,截断表并重新加载表(如本文所述:如何为表释放未使用的空间)。这也减少了未使用的空间,并将使用的空间增加到与上述图像相似的程度。 即使不建议这样做,我也尝试了DBCC SHRINKFILE和DBCC SHRINKDATABASE命令,但是它们对未使用的空间没有任何影响。 跑步 DBCC CLEANTABLE('myDB', 'dbo.myTable')并没有改变 在保持图像和文本数据类型以及将数据类型更改为varbinary(max)和varchar(max)之后,我都尝试了上述所有方法。 我尝试将数据导入到新数据库中的新表中,这也仅将未使用的空间转换为已用空间。我在这篇文章中概述了这种尝试的细节。 如果我期望这些结果,我不想在生产数据库上进行这些尝试,因此: 为什么将其中一些尝试之后的未使用空间仅转换为已用空间?我觉得我不太了解幕后发生的事情。 我还能做些其他事情来减少未使用的空间而不增加已使用的空间吗? 编辑:这是表的磁盘使用情况报告和脚本: SET ANSI_NULLS ON GO SET …

3
插入时SQL Server更改XML结构
我正在将一些XML数据插入SQL Server中的XML列,但是在插入数据后,SQL Server已对其进行了更改。这是我插入的数据 <xsl:value-of select="name/n/given" /> <xsl:text> </xsl:text> <xsl:value-of select="name/n/family" /> 当我读回它时,它看起来像这样 <xsl:value-of select="name/n/given" /> <xsl:text /> <xsl:value-of select="name/n/family" /> 注意第二行。这是一个问题,因为它更改了XSLT转换输出的方式。第一个示例将在给定名称和姓氏之间创建一个空格,而第二个示例将不创建任何空格,因此它将类似于JohnJohnsen,而第一个示例将类似于John Johnsen。 有什么办法可以解决这个问题?
15 sql-server  xml 

1
什么时候可以将SARGable谓词推送到CTE或派生表中?
沙袋 在从事高质量博客文章®的工作时,我遇到了一些优化器行为,我发现这确实令人非常恼火。我没有立即作出解释,至少没有一个我满意的解释,因此我将其放在此处,以防有人出现。 如果要继续学习,可以在此处获取2013年版本的Stack Overflow数据转储。我正在使用注释表,上面还有一个索引。 CREATE INDEX [ix_ennui] ON [dbo].[Comments] ( [UserId], [Score] DESC ); 查询一 当我像这样查询表时,我得到一个奇怪的查询计划。 WITH x AS ( SELECT TOP 101 c.UserId, c.Text, c.Score FROM dbo.Comments AS c ORDER BY c.Score DESC ) SELECT * FROM x WHERE x.Score >= 500; 分数的SARGable谓词未在CTE中推送。在计划的后期,它位于过滤器运算符中。 我觉得很奇怪,因为ORDER BY和过滤器位于同一列。 查询二 如果我更改查询,它将被推送。 WITH x …


2
具有500个数据库的SQL Server 2017-自CU9起频繁的AG断开连接
大家好,在此先感谢您的帮助。SQL Server 2017可用性组面临挑战。 背景 公司是零售B2B后端软件。大约500个单租户数据库,以及所有租户使用的5个共享数据库。工作负载特征读取最多,大多数数据库的活动很少。 托管在同一地点的物理生产服务器最近从Windows Server 2012上的SQL Server 2014 Enterprise在共享SAN / FCI配置中升级到Windows Server 2016上的SQL Server 2017 Enterprise(2插槽/ 32核/ 768 GB RAM和本地)使用AlwaysOn AG的SSD驱动器。AG业务使用带交叉电缆连接的专用10G NIC端口。 他们的要求是所有数据库都一起进行故障转移,因此他们不得不将它们全部放在一个AG中。它是同一服务器上的单个不可读取的同步副本。 新服务器已于2018年6月投入生产。安装了最新的CU(当时为CU7)和Windows更新,并且系统运行良好。大约一个月后,在将服务器从CU7更新到CU9之后,他们开始注意到以下挑战,按优先顺序列出。 我们一直在使用SQL Sentry监视服务器,没有发现物理瓶颈。所有关键指标似乎都不错。CPU平均为20%,IO时间通常小于1ms,RAM未被充分利用,并且网络<1%。 挑战性 故障转移后,症状似乎会好转,但几天后又回来了,不管哪个服务器是主要服务器-两个服务器上的症状都相同。 零星的客户端超时和连接故障,例如 建立连接时发生错误 要么 执行超时已过期 有时这些会持续40秒钟,然后消失。 事务日志备份作业完成的时间比以前长10倍。以前备份所有500个数据库的日志需要2到3分钟,现在备份需要15到25分钟。我们已经验证了备份本身可以很好地运行并具有良好的吞吐量。但是,在完成一个日志的备份之后和启动下一个日志之前会有一个小的延迟。它开始时非常低,但是在一两天内会达到2-3秒。乘以500个数据库,便有区别。 有时,一些看似随机的数据库在手动故障转移后会陷入“未同步”状态。解决此问题的唯一方法是在辅助副本上重新启动SQL Server服务,或者将这些数据库删除并重新加入AG。 CU10引入的另一个问题(在CU11中未解决):在master.sys.databases上阻塞时,辅助超时的连接,甚至无法将SSMS对象资源管理器用于辅助副本。根本原因似乎是由Microsoft SQL Server VSS编写器发出以下查询阻止的: select name, recovery_model_desc, state_desc, CONVERT(integer, is_in_standby), ISNULL(source_database_id,0) from …

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.