数据库管理员

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

2
无法删除没有相关文件的文件组
我在SQL Server 2017 CU3上遇到一些奇怪的错误消息。我正在迁移数据库并重组文件组。“重新组织”是指我使用存储过程,该过程在对象的新文件组上创建分区函数和分区方案,在分区时重建索引,然后删除分区。 最后,我有一些空文件组。他们的文件被删除。文件组本身也将被删除。在大多数情况下,此方法效果很好。但是对于两个数据库,我删除了文件... 剩下一个文件组,但没有文件关联,但是 ALTER DATABASE REMOVE FILEGROUP 引发错误5042: 无法删除文件组“ xyz”,因为它不为空。 题 我如何摆脱那个空文件组...可能是什么问题? 我已经阅读了一些常见问题,但是它们在我的系统中不存在: 已检查: SELECT * FROM sys.partition_schemes; SELECT * FROM sys.partition_functions; 0行...数据库中没有分区对象 UPDATE STATISTICS 对于数据库中的所有对象 没有效果 检查文件组上的索引: SELECT * FROM sys.data_spaces ds INNER JOIN sys.indexes i ON ds.data_space_id = i.data_space_id WHERE ds.name = 'xyz' 0行 检查文件组中的对象: …

1
如何仅使用Xpath从SQL Server中的空XML标记返回null?
我有一个应用程序,可以在XML列中存储有关记录的各种用户定义的数据点。我无法控制如何存储或更新这些内容。 当我查询列时,它可以返回3个值中的1个: 价值 空值 空字符串 $ 64问题我想使用xpath将这些空字符串作为null返回。 我已经找到了很多有关将null作为空字符串返回的答案,但这种方式一无所获。 当有人删除了值时,它们最终以这种方式结束,而不是删除标签,而是将其空白为<value />标签。当从未设置过该值时,将出现空值。他们没有包括xsi:nil。 我已经完成了一个案例声明: select so.SalesOrderId, Case when sopc.value('(Value)[1]','smalldatetime') IS null then Null when sopc.value('(Value)[1]','smalldatetime') ='' then Null Else sopc.value('(Value)[1]','smalldatetime') End as sopc From SalesOrders so Outer apply so.CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[Name="ProjCompleted"]') sopc(sopc) 但这感觉效率低下,并且这不是唯一的专栏,因此使代码更长且更难维护。 编辑以包括样本数据 SalesOrderId CustomColumns SO 1 "<CustomColumnsCollection> <CustomColumn> <Name>ProjCompleted</Name> <DataType>1</DataType> <Value /> </CustomColumn> …

1
重新构建HEAP是否会导致停机?
这是一个令人尴尬的问题,我不敢相信我已经错过这么多年了。 我有一个具有401堆表的供应商第三方数据库。我最近开始使用Brent Ozar的脚本并设置sp_BlitzFirst为每15分钟运行一次以收集等待统计信息等。 它所发现的是,每次运行24小时都在告诉我修复转发记录。可能使某些读者感到震惊的是,我对DMV进行了查询,并获得了一些表,这些表具有超过150,000个转发的记录值。 我知道解决此问题的方法是在表中使用聚集索引,或者作为运行时的临时解决方法ALTER TABLE [tablename] REBUILD。 但是,我无法找到的是这是否使表脱机,以及在运行此命令之前是否应该注意其他问题。 我正在使用2008 R2企业版,并且不知道以这种方式运行它是否可以消除中断的需要? ALTER TABLE [tablename] REBUILD WITH (ONLINE = ON); 有人对这个有经验么?

1
SQL Server无法将NULL存储在固定长度的列中吗?
我在Oracle官方文档中遇到了以下声明: 在Microsoft SQL Server中,只有具有可变长度数据类型的列才能存储NULL值。创建允许固定长度数据类型为NULL的列时,该列将自动转换为系统可变长度数据类型... 我从未在SQL Server文档中阅读过此书,也从未经历过这样的事情。相反:在SQL Server中,固定长度的数据类型(例如int和float,还包括char)被大量使用,并且即使可以为NULL时也非常有效地存储。 这个Oracle声明背后有什么根据吗?

1
从表返回的重复记录,没有重复项
我有一个存储过程,用于查询繁忙的队列表,该表用于在我们的系统中分配工作。有问题的表在WorkID上具有主键,并且没有重复项。 该查询的简化版本是: INSERT INTO #TempWorkIDs (WorkID) SELECT W.WorkID FROM dbo.WorkTable W WHERE (@bool_param = 0 AND ((W.InProgress = 0 AND ISNULL(W.UserID, -1) != @userid_param AND (@bool_filtered = 0 OR W.TypeID IN (SELECT TypeID FROM #Types AS t))) OR (@bool_param = 1 AND W.InProgress = 1 AND W.UserID != @userid_param) OR …

2
从生产中的表中删除列
我们有一种情况需要将2个表之间的关系从m:1更改为m:n。 因此,我们需要在这两个表之间创建一个交叉引用表。 将所有现有数据从“子”表迁移到交叉引用表后,删除子表中的原始外键列不是一个好主意吗? 如果我们把它留在那儿,基本上就是技术债务。但是我不是dba,也不太了解从表中删除列的含义。(我知道这是可能的,但这是一个坏主意吗?我的数据库会为此讨厌我吗?) 谢谢

1
使用FILESTREAM文件组备份和还原SQL Server数据库
我使用SQL Server,并具有一个包含两个文件组的庞大数据库: 主数据库:包含大文件(1MB +)之外的所有数据 FILESTREAM(读/写):包含大文件 现在,备份方案为: 每个星期五获得完整备份(凌晨2点) 除周五外,每周的每一天都将获得差异备份(凌晨2点) 由于数据库很大,并且正在远程服务器上生产,因此,每当我想将数据库带到本地环境以创建测试数据库时(每周一次),我都必须同时带主数据流和文件流。 我希望能够更改备份和还原的方式,而只需要携带主要文件组,而不必考虑文件流。这样,每周我只带主要文件组,而不带所有假定文件流的信息。 我认为可能存在很多问题,并且在访问文件时所有文件流引用都可能丢失。我想知道在执行备份时是否可以修改所有文件流列的内容,或者使用测试环境中托管的其他文件流。另外,我听说过仅部分文件组进行零碎恢复的情况,但是我对如何执行它有很多疑问。 问题1:我可以遇到这种情况吗? 问题2:只有一个完整备份并将差异备份/事务日志带到测试环境是个好主意吗? 问题3:我可以有更好的方案进行备份和还原吗? 我很乐意提出建议。如果您有任何示例案例,请通过T-SQL查询向我展示。

5
Intellisense SSMS 2017中的自动完成功能。去哪儿了?
我最近有一个新的开发箱,安装了Visual Studio。安装了我的SSMS。开始编写一些proc和表...没有智能帮助。 哇啊? 所有方框均已打勾。我在正确的数据库中。如果表不存在,则会出现红色弯曲,但是我没有弹出窗口来完成对象名称。我肯定搞砸了,因为我的谷歌搜索告诉我2017年智能感知能力有了很大提高。 2018年11月6日更新 我删除了我自己的答案,说缓存是罪魁祸首,因为在允许和不允许自动完成方面,它似乎仍然非常脆弱。我可以跳回到SMSS的早期版本,并获得直到此版本之前我都习惯的那种快速的结果。 我已经开始将Azure Data Studio用于日常工作。超级活泼。QoL的许多改进。甚至没有足够的功能来进行服务器管理,但对于常规proc编写和数据分析而言却要好得多。

1
更改“最大服务器内存”除了清除计划缓存并(显然)更改内存设置还有什么作用?
在32 GB内存和4个内核,60-80个并发连接上运行SQL Server 2012 SP3,同时具有很大的临时工作负载,我们看到SQL Server进程(CPU)高峰,并且每天在不可预测的时间高峰一次或两次。我们正在努力确定峰值的根本原因。同时,我们发现更改最大内存设置(向上或向下)似乎是使CPU负载恢复正常的唯一方法。 检查日志并搜索StackExchange(https://dba.stackexchange.com/a/183276),我们看到通过更改最大内存设置可以刷新计划缓存。但是,如果我们通过DBCC FREESYSTEMCACHE('SQL Plans')刷新计划缓存,则CPU负载不会恢复正常。 由于更改“最大内存”设置可以解决问题,无论天气如何增加或减少,该问题似乎都与“最大服务器内存”设置没有直接关系。因此,我们试图了解更改内存设置的其他作用,然后使用该信息来帮助确定CPU峰值的根本原因。

1
将SSMS中的“未连接”查询窗口重新连接到原始连接
是否有一种简单的方法可以将“未连接”的查询窗口重新连接到该查询使用的原始连接,而无需手动选择所需的服务器名称?如果单击“ SQL编辑器”工具栏上的“连接”按钮,或右键单击->“连接”->“连接...”,则服务器名称默认为我在该SSMS会话中使用的最后一个连接,而不是该特定查询窗口使用的最后一个连接。 在一天结束后将笔记本电脑带回家后,所有打开的窗口都将设置为下次使用时未连接。理想情况下,我希望能够将所有连接重新连接到其原始连接,但是我不知道一次甚至只有一个查询也是可能的。

2
SQL Server 2012 SP3的内存不足问题
我一直有周期性的SQL Server OOM错误,一次是SQL Server关闭自身,并总是在夜间发生,这时没人使用它,并且那时没有SQL Agent作业运行: 这是典型的错误: 08/17/2017 19:31:17,spid100,未知,资源池``内部''中没有足够的系统内存来运行此查询。 2017年8月17日19:31:17,spid100,未知,错误:701严重性:17状态:123。 2017年8月17日19:31:17,spid112,未知,错误:18056严重性:20状态:29.(Params :)。由于格式化期间出错,因此以简洁模式打印错误。跟踪ETW通知等已跳过。 这是服务器信息: 最小10 GB的SQL Server内存 最大21GB SQL Server内存 服务器上只有4个DB 它们的大小每个只有1到2 GB Tempdb的大小从未增长到超过1GB(设置为自动增长到10GB) 索引均为低碎片指数,统计信息已更新 版: Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Oct 20 2015 15:36:27 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build …

3
根据特定公式找到最小的缺失元素
我需要能够从具有数千万行的表中找到丢失的元素,并且具有一BINARY(64)列的主键(这是要从中计算出的输入值)。这些值主要是按顺序插入的,但有时我想重复使用先前删除的值。用IsDeleted列修改已删除的记录是不可行的,因为有时会插入一行,该行的行数比当前现有行的数百万。这意味着样本数据将类似于: KeyCol : BINARY(64) 0x..000000000001 0x..000000000002 0x..FFFFFFFFFFFF 因此,在0x000000000002和之间插入所有缺少的值0xFFFFFFFFFFFF是不可行的,所用的时间和空间将是不希望的。本质上,当我运行算法时,我希望它返回0x000000000003,这是第一个开始。 我想出了一个用C#进行二进制搜索的算法,该算法将查询数据库中position处的每个值i,并测试是否期望该值。对于上下文,我的算法很糟糕:https : //codereview.stackexchange.com/questions/174498/binary-search-for-a-missing-or-default-value-by-a-given-formula 例如,此算法将在具有100,000,000个项目的表上运行26-27个SQL查询。(这似乎不是很多,但它的将要发生的非常频繁。)目前,这个表中有大约5000万行,并且表现越来越明显。 我的第一个替代想法是将其转换为存储过程,但这有其自身的障碍。(我必须编写一个BINARY(64) + BINARY(64)算法,以及许多其他东西。)这将很痛苦,但并非不可行。我也考虑过基于实施翻译算法ROW_NUMBER,但是对此我感到很不好。(BIGINT对于这些值,A 几乎不够大。) 我想提出其他建议,因为我真的需要尽快。值得的是,C#查询选择的唯一列是KeyCol,其他与该部分无关。 同样,就其价值而言,当前获取适当记录的查询大致如下: SELECT [KeyCol] FROM [Table] ORDER BY [KeyCol] ASC OFFSET <VALUE> ROWS FETCH FIRST 1 ROWS ONLY <VALUE>算法提供的索引在哪里。我也没有这个BIGINT问题OFFSET,但是我会的。(现在只有5000万行意味着它永远不会要求该值以上的索引,但是在某个时候它将超过该BIGINT范围。) 一些其他数据: 从删除来看,gap:sequential比率约为1:20; 表中的最后35,000行的值> BIGINT的最大值;

3
如何在100 GB表上创建聚簇索引
我有一个堆表,该表占用约104 GB的磁盘空间,近30亿行。我正在尝试在[ WeekEndingDate]列上的此表上创建聚簇索引。我在数据文件中有大约200 GB的可用空间,在tempdb中有大约280 GB的可用空间。 我尝试了两种不同的方法。首先是使用以下命令直接在表上创建索引: CREATE CLUSTERED INDEX CX_WT_FOLD_HISTORY ON WT_FOLD_HISTORY (WeekEndingDate ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = ON, IGNORE_DUP_KEY = OFF , ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE) 我尝试了SORT_IN_TEMPDB = ON和OFF。使用时,ON它会填满tempdb,并OFF填满数据驱动器。 另一种方法是使用所需索引创建一个新的空白表,然后将堆中的记录插入到新表中。填满数据驱动器后,此操作也失败。 关于该怎么做的其他建议。我读过的大多数内容都表明,在创建索引时,需要大约1.2倍的表大小才能用作工作空间。我有更多的方法,但仍然失败。任何建议,将不胜感激。 这是我原来的堆表结构: CREATE TABLE [dbo].[WT_FOLD_HISTORY]( [WeekEndingDate] …

1
从varbinary(max)中清空数据后缩小DB的最佳方法?
我们有一个数据库,其中有大量数据存储在varbinary(max)类型的字段中。在某些时候,我们可以清除大多数行(但不是全部)的数据。我们的计划是使该字段可为空,并在不再需要该数据时将其清空。完成后,我们希望减少数据库的大小。做到这一点的最佳方法是什么? 如果没有一种利用当前设置回收空间的好方法,那么我的一个想法就是将数据字段移动到只有两列的单独表中:主表的键和数据字段。然后,当不再需要这些行时,我们可以简单地删除它们。(然后进行某种缩小。)但是,与简单地使现有字段可为空相比,这将是一件困难得多的更改。 注意:实际上,我不太关心使数据库文件变小,但是我关心新释放的空间变得可重用。 这一字段占数据库大小的90%以上。我已经在3TB了。

1
SQL Server 2016仍然包含sqlmaint.exe吗?
根据文档(SQL Server 2016中不推荐使用的数据库引擎功能),sqlmaint.exe仍然应该可用(强调我的): 本主题描述了SQL Server 2016中仍然可用的不推荐使用的SQL Server数据库引擎功能。这些功能计划在 SQL Server 的将来版本中删除。 ... 工具:sqlmaint实用工具... 绝对不会在已停用功能列表中列出该功能。 但是,我sqlmaint.exe在最近安装的SQL Server 2016 Express系统上找不到。在以前的版本中,它与处于同一文件夹中sqlserver.exe。 文档有误吗?还是文件位置移动了?还是在安装过程中错过了什么? (注意:受重现此问题的评论的鼓舞,我为此创建了一个Microsoft Connect条目,该条目已迁移到UserVoice。)

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.