然而,许多年过去了,自从它被报道以来,有几个主要版本进入了市场。
问题: SQL Server 2017 是否提供任何机制来轻松找出此错误的根本原因?还是像大约 9 年前报告该问题时一样难以调查?
上周我们的数据库发生了一些奇怪的事情。突然之间,应用程序阻止了我们无法保存新实体等的用户。在查看 SQL Server(2008 兼容模式 2005)的活动监视器后,我看到以下三个条目:

一段时间后,用户出现连接超时。当我杀死进程64时,他们可以再次正常保存。
问题是他们在块期间尝试保存的实体被多次插入数据库(最多 3 次),即使有代码可以防止这种情况发生(数字列必须是唯一的但没有约束...检查发生在代码中)。
我们使用实体框架 6.0。
在 Dynamics AX 中有一个缓存机制,可以将表配置为加载到内存中并缓存。此缓存限制为一定数量的 KB,以防止出现内存问题。我正在谈论的设置被调用entiretablecache并在请求单个记录时将整个表加载到内存中。
直到最近,我们依靠一些脚本来验证具有此设置的表的大小,以查看表大小是否高于此限制。
然而,现在,压缩开始发挥作用,诸如sp_spaceused或sys.allocation_units 之类的东西似乎报告了压缩数据实际使用的空间。
显然,应用程序服务器正在处理未压缩的数据,因此 SQL Server 中磁盘上的数据大小无关紧要。我需要未压缩数据的实际大小。
我知道sp_estimate_data_compression_savings但正如名字所说,这只是一个估计。
我希望尺寸尽可能正确。
我能想到的唯一方法是一些复杂的动态 SQL 创建与压缩表具有相同结构的未压缩表,将压缩数据插入到影子表中,然后检查影子表的大小。
不用说,这有点乏味,在数百 GB 的数据库上运行需要一段时间。
Powershell 可能是一个选项,但我不想遍历所有表以select *对它们执行 a以检查脚本中的大小,因为这只会淹没缓存并且可能需要很长时间。
简而言之,如果可能的话,我需要一种方法来获取每个表的大小,因为它一旦被解压缩,并且在呈现给应用程序的等式中会出现碎片。我对不同的方法持开放态度,首选 T-SQL,但我不反对 Powershell 或其他创造性方法。
假设应用程序中的缓冲区是数据的大小。bigint 始终是 bigint 的大小,而字符数据类型是每个字符 2 个字节(unicode)。BLOB 数据也占用数据的大小,枚举基本上是一个整数,数字数据是 numeric(38,12),datetime 是日期时间的大小。此外,没有NULL值,它们要么存储为空字符串,要么存储1900-01-01为零。
没有关于如何实现的文档,但这些假设基于一些测试以及 PFE 和支持团队使用的脚本(显然也忽略了压缩,因为检查是在应用程序中构建的,而应用程序无法分辨)如果底层数据被压缩),它还检查表大小。例如,此链接指出:
避免对大型表使用 EntireTable 缓存(在 AX 2009 中超过 128 KB 或 16 页,在 AX 2012 中超过“整个表缓存大小”应用程序设置[默认值:32KB 或 4 页])——改为使用记录缓存。
我有一个将 650 个字段插入表中的存储过程。插入失败并出现截断错误。
这是一个简单的
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
Run Code Online (Sandbox Code Playgroud)
下面是错误信息:
消息 8152,级别 16,状态 14,过程 DSP_Procedure,第 1075 行 字符串或二进制数据将被截断。
有没有一种快速的方法可以识别导致截断错误的字段?
要插入表中的 select 语句有 650 个字段,因此很难确定哪个字段导致了截断错误。
我想我可以一次注释掉字段块,以便 SP 一次只插入 100 个字段,然后运行 SP 6 或 7 个不同的时间,直到我至少可以缩小到一组 100 个字段这将包含导致截断错误的字段。
或者,我在想,也许我可以只创建SELECT INTO一个新表,然后将表中的数据长度与我尝试插入到我的 SP 中的目标表的数据长度进行比较,以查看哪个字段包含比预期更长的字段长度。 ..
我正在使用 SQL Server 2014。
有没有更简单的替代品?
我有一个包含两列的表,Parent并且Child.
我需要获取与父记录关联的所有后代的列表。
Source Table
+----+-----------+
| Parent | Child |
+----+-----------+
| a | b |
| b | c |
| c | d |
| d | e |
| e | f |
| f | x |
+----+-----------+
Expected Result:
+----+-----------+
| Parent | Child |
+----+-----------+
| a | b | // As b is the child of a, all the descendants of b
| a | c | // are …Run Code Online (Sandbox Code Playgroud) 当我使用以下查询监控我的备份时:
SELECT command, percent_complete,
'elapsed' = total_elapsed_time / 60000.0,
'remaining' = estimated_completion_time / 60000.0
FROM sys.dm_exec_requests
WHERE command like 'BACKUP%'
or command like 'RESTORE%'
Run Code Online (Sandbox Code Playgroud)
我注意到在备份之前,SQL Server 只在备份之后执行还原标头。
我想知道它有什么用处,以及它的执行时间是否可以以某种方式减少。它似乎比实际备份花费的时间更长。
我下载了适用于 MS SQL Server 2014 Express 的 LocalDB 和 Management Studio,以便我可以在本地机器上练习。但是,当我打开 Management Studio 并尝试浏览到 localDB 以连接到启动创建的数据库时,我无法找到 localDB。
有人可以帮助我吗?
我在我的数据库中使用时态表,当我在 Management Studio 2017 (v17.4 14.0.17213.0) 中右键单击我的表时,我没有在上下文菜单中看到选择前 1000 行(非时态表没有问题)
任何想法如何让这个上下文菜单回来?我感觉这与我运行的 SQL Server 版本有关(SQL 13.1.4001.0 Express Edition)
我正在使用扩展事件为 SQL Server 设置监控系统,以便为我们的开发人员查找大量查询作为“生产反馈”。我正在使用事件sp_statement_completed和sql_statement_completed,并在 cpu_time、逻辑读取等上使用谓词过滤器。我希望将结果汇总database_name并query_hash喜欢在互联网上的众多示例中展示的结果,但在结果中我看到query_hash所有语句都是 0使用 EXEC,如下表所示(为了便于阅读,缩短了时间戳和查询哈希)。
name timestamp query_hash plan_handle statement
sql_statement_completed 2016...6414 0 050056019600764... exec Shared.dbo.SyncFirm
sql_statement_completed 2016...9946 0 06003d00e01e730... exec spSetUserAuth @userid;
sql_statement_completed 2016...7184 0 0600e30028c9da0... exec spSetUserAuth @userid;
sp_statement_completed 2016...0409 9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable
sp_statement_completed 2016...1448 8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns) EXEC(@sql)
sql_statement_completed 2016...7752 0 0600f9006c23f03... exec spSetUserAuth @userid;
sql_statement_completed 2016...1443 1304...641 06005a0008a9b11... select SUBQ.ontrackstatus, COUNT(SUBQ.ontrac
Run Code Online (Sandbox Code Playgroud)
所有结果都有其价值,plan_handle而且它们都不同,因此正在制定很多计划。其他没有query_hash(我见过的)语句包括 ALTER …
我有一个 SQL Server 2014 的生产实例,我需要对其进行一些轻度维护。
本质上,我需要在单个事务中替换两个整个表的内容。我想防止任何人在数据更改正在进行时查询任一表。桌子很小,我希望操作不到几秒钟。
不幸的是,我没有为此安排停机时间的好处。
所以问题是如何一次锁定多个对象 - 甚至整个数据库?
理想情况下,我可以简单地获取数据库级锁,进行更改,然后释放锁,但这在 SQL Server 2014 中似乎是不可能的。
sql-server ×9
backup ×1
cache ×1
compression ×1
installation ×1
locking ×1
recursive ×1
size ×1
ssms ×1
string ×1
t-sql ×1