Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
SQL Server 2016企业版性能不佳
抱歉,很长,但是我想给您尽可能多的信息,以便对分析有所帮助。 我知道有几个帖子有类似的问题,但是,我已经关注了网上发布的这些帖子和其他信息,但是问题仍然存在。 我在SQL Server中遇到严重的性能问题,这使用户发疯。这个问题持续了好几年,直到2016年底由另一个实体管理,从2017年开始由我管理。 在2017年中,我能够按照Microsoft SQL Server 2012性能仪表板报告中指示的索引提示解决问题。效果是立竿见影的,听起来像魔术。在过去的日子里,几乎总是100%的处理器变得超级宁静,并且用户的反馈声也很高。甚至我们的ERP技术人员也很高兴,因为通常需要20分钟才能获得某些清单,最后他可以在几秒钟内完成。 但是,随着时间的流逝,它开始慢慢恶化。我避免创建更多索引,因为担心过多的索引会降低性能。但是在某些时候,我不得不删除那些没用的东西,并创建Performance Dashboard向我建议的新东西。但没有影响。 在ERP中进行保存和咨询时,感觉到的缓慢本质上。 我有专用于SQL Server 2016 Enterprise(64位)的Windows Server 2012 R2,具有以下配置: 处理器:Intel Xeon CPU E5-2650 v3 @ 2.30GHz 记忆体:84 GB 在存储方面,服务器具有专门用于操作系统的卷,专门用于数据的卷和专门用于日志的卷。 17个数据库 使用者: 在最大的数据库中,大约有113个用户并发连接 另外约有9位使用者 其中两个是3 + 3 其余各只有1个用户 我们有一个网站,它也为较大的数据库编写数据,但是使用情况不那么常规,应该有大约20个用户。 数据库大小: 最大的数据库有290 GB 第二大有100GB 第三大有20 GB 第四个14 GB 其余各只有3 GB以上 这是生产实例,但我们也有一个开发实例,我相信可以为此忽略它,因为在大多数情况下,我是唯一的连接对象,但是即使没有连接,该问题也会不断发生。 处理器几乎总是这样: 我们的例程在夜间运行(没有问题),而某些例程在白天运行。 …

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
重新构建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
如何在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。)

2
SQL Server 2014压缩和最大行大小
我需要创建一个包含许多十进制(26,8)列的宽非规范化表(少于1024列限制,大多数列将为null或零)。我知道每行限制8060字节,因此我尝试创建具有页面压缩功能的表。下面的代码创建表,插入一行并查询行大小。行大小远低于限制,但是如果我尝试向表中再添加一个小数(26,8)列,操作将失败,并显示错误“创建或更改表't1'失败,因为最小行大小为8074,包括1256”内部开销字节。”。有什么方法可以创建具有这么多列的单个表吗? drop table t1 GO create table t1(c1 decimal(26, 8) null) with (data_compression = page) GO declare @i int = 2; declare @sql varchar(100); while @i <= 486 begin set @sql = 'alter table t1 add c' + convert(varchar, @i) + ' decimal(26, 8) null'; execute (@sql); set @i += …

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.