在生产 SQL 服务器上,我看到数据流量出现间歇性的巨大峰值。高达 200Mbit/s,这会导致 NETWORK IO 等待,从而导致查询超时。如何找出返回大结果集的查询?
我客户的 SQL 服务器上有很多数据库。这些数据库正在开发中,因此开发人员可以进行设计、重构、数据修改等。有一些数据库很少更改。我的客户必须确保所有这些都安全(备份)并花一些时间管理环境。(公司没有DB管理员职位。)经过长时间的讨论,客户决定使用每日完整备份策略,因为恢复容易。
所以这里是情况的总结:
主要问题:如何检测数据库已更改。问题的第一部分(DDL 更改)可以通过使用DDL 触发器来解决。但是数据更改(DML 更改)是一个问题。不可能将 DML 触发器应用于所有数据库的所有表以跟踪更改(性能、扩展对象的管理......)。备份引擎必须跟踪所有更改以将每个数据库标记为准备备份。
Change Data Capture是一个解决方案,但它似乎太重了(它还需要 SQL Server 企业版)。
另一种方法是跟踪数据库文件更改(大小或上次更改时间),但它无法正常工作:当数据库超过所有保留的可用空间时,它可以更改其大小,而sp_spaceused不是解决方案。
跟踪是一种解决方案,但它会导致性能问题并需要额外的管理。
是否有任何解决方案可以在不影响其他数据库管理对象(如统计信息..)的情况下计算实际数据库使用大小?当然,对不改变表大小的表数据的更改不会触发(我认为),但总比没有好。我真的在寻找 SQL Server 2008 的直接或间接解决方案。
感谢您的任何评论、解决方案和想法。
添加:
这是解决方案(感谢玛丽安):
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation …Run Code Online (Sandbox Code Playgroud) 您什么时候开始对 SQL Server 2005/2008 死锁进行故障排除以及如何进行?警报通过 SQL Server 性能条件警报打开 SSMS,对象->SQLServer:Locks,Counter->Lock Waits/Sec,Instance:_Total,警报如果 counter: 上升到值 3 以上。这是一种主动监控它的方式吗?可接受的值是多少?我非常感谢你的帮助。谢谢!!!
我们在生产环境中遇到了一些性能问题。
我们发现,当活动会话数超过 25 时,CPU 使用率达到 100%,并且需要很长时间才能下降。
我们拥有的环境:
产品 Microsoft SQL Server 企业版 9.3(sp2)
CPU 2(至强 2.13)
内存7G
会话详细信息 1 的快照
活动会话 25
第 496 章
空闲会话 289
被阻止的交易29
会话详细信息 2 的快照
活动会话 59
活跃交易 885
第 267 章
被阻止的交易49
我想知道:
2CPU 是否可以处理25 个活动会话(500 个活动事务)。 PS:我们测试过,没有并发请求,一个事务,读/写5 个表,在应用程序级别大约需要1 秒。
阻塞的事务是否占用更多的CPU。 PS:阻塞的事务主要是因为2个表上的锁。
解决方案是什么:添加 CPU 或调整应用程序(java/hibernate)以缩短此事务并减少表中的块?
我在 SQL Server 2008 生产数据库上遇到了与事务相关的问题。简要概述一下,我们有一个网站,该网站在该州拥有众多并发用户,他们通过 ASP.Net 网站执行 GUI 类型的工作(添加记录、修改、查看等)。
每个插入和更新都在它自己的事务中完成,由数据访问层处理。我相信,数据库隔离设置为 Read_Commited。
一切正常。
但是,已添加一个新模块,该模块轮询单独的数据库以获取信息。如果有新信息,一个进程会启动一个新事务,并使用相同的数据访问器代码从我们的数据库中读取,以及从另一个单独的数据库中读取新信息。然后它会进行大量检查以查看它必须对新数据做什么......然后开始对我们的数据库进行大量更新或插入。这一切都在一个大交易中。来自 UI 应用程序和轮询服务的所有插入和更新都经过相同的 CRUD 过程。由于要处理的传入消息可能包含许多需要更新的实体,因此完成事务的时间可能在瞬间到一分钟之间。
但是我们发现,当处理较大的消息时,UI 会锁定,并且可以为用户锁定 3 分钟。
因此,我们认为在选择中添加“NOLOCK”提示可能会有所帮助。它没有。好吧,它可能有所帮助,但锁定仍在发生。
我认为原因可能是消息到达,并且启动了一个事务,这导致其他事务无法工作(即使是 SELECT 语句,我也不明白)。分析数据库表明,即使是简单的选择也需要很长时间才能在 UI 上完成(简单,例如SELECT fields FROM SingleTable WHERE PrimaryKey = Value
我们的索引似乎没问题……我们在所有表上都有触发器,它们只是将更新和插入复制到 AUDIT 数据库表中。不要认为他们是问题所在。
我认为这是因为围绕消息处理的事务,这将 UI 锁定。
任何人都可以分享经验或告诉我在哪里可以查看为什么我们会遇到 UI 锁定?UI 应该有优先权。消息处理是后台的事情......用户需要优先......但似乎消息正在锁定数据库......我们不确定UI是否曾经锁定消息处理。
希望有人可以提供帮助。我可以提供尽可能多的信息来提供帮助。