我有一个大的删除存储过程,并且在删除不会删除任何内容的情况下重现了死锁。
看起来遇到死锁的存储过程的部分是这样的(更改了表名):
DELETE d
FROM Table1 d
inner join dbo.Table2 orc on orc.id = d.Table2Id
inner join dbo.Table3 orr on orr.id = orc.Table3Id
inner join Table4 oeh on oeh.id = orr.Table4Id
inner join @deleteEntities de on de.id = oeh.EntityId
Run Code Online (Sandbox Code Playgroud)
在我看来,尝试从这个大表中删除时,两个删除操作同时运行并且彼此死锁。对于这些项目,我知道不会有非常大的表 table1、table2、table3 的记录。
我想知道这是否可以通过更改为:
DELETE d
FROM Table1 d WITH(rowlock)
inner join dbo.Table2 orc on orc.id = d.Table2Id
inner join dbo.Table3 orr on orr.id = orc.Table3Id
inner join Table4 oeh on oeh.id = orr.Table4Id
inner join @deleteEntities de on de.id = …Run Code Online (Sandbox Code Playgroud) 我有一个带有 SP4 的 SQL Server 2005 Std (x64),它有一个我似乎无法杀死的过程。如果我查看 sys.dm_exec_requests,我会看到 SPID 103,wait_type 为 LCK_M_SCH_M,状态为 SUSPENDED,命令为 KILLED/ROLLBACK。然而,SPID 并没有消失。我什至可以执行 sp_who 103 并且我看到带有 KILLED/ROLLBACK 的 SPID。自从我杀死 SPID 以来,它的当前等待时间接近 20 小时。
此外,运行KILL 103 WITH STATUS ONLY返回 0% 已完成
我目前有一些位于子域上的 SQL Server。我们正在消除该子域并将所有内容移至常规域。
就 SQL Server 配置而言,除了可能使用不同的服务帐户之外,还有什么我需要更改的吗?
请注意,这只是一个域更改 - 服务器名称应该相同。
哪个会跑得最快?
我们目前有一些程序需要维护其表的过滤副本。
涉及的表:
[MasterTable] 包含过滤条件[ChildTable] 被过滤[ChildFilterTable] 保存过滤后的记录目前正在通过以下方式完成这项工作:
示例 SQL:
DECLARE @FilterValue INT
/* Get FilterValue to check */
SELECT @FilterValue = FilterValue FROM [MasterTable] WHERE ID = @IDFromChildTable
IF @FilterValue = 123
BEGIN
/* Attempt update */
UPDATE [ChildFilterTable] SET
...
WHERE ChildID = @IDFromChildTable
IF @@ROWCOUNT = 0
BEGIN
/* Row not there yet, insert it! */
INSERT INTO [ChildFilterTable] (ChildID, ....) VALUES (@IDFromChildTable, ....) …Run Code Online (Sandbox Code Playgroud) 我是一名刚刚晋升的新 DBA,我正在寻找一些包含用于 DBA 任务的 T-sql 脚本的好站点。是否有一个通用的地方,您可以从那里获得一个集合脚本来执行诸如调整、重新索引、DMV、恢复、镜像等操作。
谢谢你的聆听
我正在使用 sqlcmd.exe 运行一个大型 SQL 脚本,并且服务器 CPU 使用率在过去 5 小时内一直处于 100%。SQL 脚本文件的大小为 156 MB。我在 SQL Server 2005 上运行脚本。这对我来说并不正常。
使用 SQL Server Management Studio 运行脚本不是一种选择,因为它不会运行非常大的文件。
注意:我知道 SQL 脚本很好,因为我可以使用另一个工具(xSQL 数据)在本地机器上运行它。不幸的是,我无法访问服务器上的该工具。
我有三个对象的“级别”数据库:A,B,和C。表A有大约 100000 行,B有 500000,C有 200 万。
出于愚蠢,我将数据库设计为使用连接表AB和BC,即使这些是 1:m 并且可以表示为ParentA属性 inB和ParentB属性 in C。我这样做是因为我当时认为这些可能是 m:m。
现在,我还有一个表D,它与C. 为了简化用户的数据管理,这是有道理的,让他们涉及D到A或B而不是直接到每个C。
所以,我已经连接表DA,DB以及DC和加入视图DC2,包括DC以及继承的DC关系,从加入的DA-AB-BC和DB-BC。我为此使用了 UNION ALL,并且有一些业务逻辑可以防止用户D在两个级别分配相同的记录。
问题是,DC2有点糟糕的表现。所有其他表都具有用于这些连接的适当覆盖索引,并且覆盖索引是聚集的。DC2 不包括表A、B、C …
我有一个全文查询,它通常非常快,但当它导致统计更新时可能会超时,因为该数据库上的统计更新非常慢。通常,在更新统计信息后,查询会“恢复”到正常速度,但我见过查询总是超时的情况,我只能用统计信息从未更新的事实来解释(或者我认为是这样)。
不幸的是,我此时无法重现该问题,因为我们将统计更新切换为“异步自动更新统计”以防止超时发生(稍微过时的统计信息对我们来说不是问题)。
所以我的问题是
如果将统计更新设置为(默认)同步统计更新(异步自动更新统计 = false),是否可以保证在超时的查询上更新统计信息?
我发现了一个引用,否则说明- 如果是这种情况,我无法解释持续超时查询的情况。
我正在处理一个 sql 数据库,当我在系统上输入一些数据时,它由于电源故障而损坏。
我将我的数据库设置为紧急模式,以便在转储数据库之前可以从中获取一些数据,但我不断收到错误消息:
由于数据移动,无法继续使用 NOLOCK
我将数据库设置为离线模式,现在当我尝试将其在线时。它给了我这个错误
为数据库 'xyz' 设置离线失败。
传递给数据库“xyz”中的日志扫描的日志扫描编号 (1224:41:1) 无效。此错误可能表示数据损坏或日志文件 (.ldf) 与数据文件 (.mdf) 不匹配。如果在复制期间发生此错误,请重新创建发布。否则,如果问题导致启动失败,请从备份中恢复。恢复期间发生错误,导致数据库“xyz”(数据库 ID 5)无法重新启动。诊断恢复错误并修复它们,或从已知良好的备份中恢复。如果未纠正或预期错误,请联系技术支持。无法打开数据库 'xyz'。它已被回收标记为可疑。有关详细信息,请参阅 SQL Server 错误日志。ALTER DATABASE 语句失败。(Microsoft SQL Server,错误:9003)
我正在尝试为报告创建一个视图,以便我可以轻松跟踪我在服务器上安排的所有备份。所有这些备份都安排在维护计划的子计划中,因此作业名称都以“Backup.”开头。
我遇到的问题是,我希望能够轻松查看作业计划再次运行的时间以及计划的频率。sysschedules 表具有字段 freq_type 和 freq_interval。可以在此处找到它们的值的定义。正如您所看到的,由于缺乏更好的描述方式,这些字段是累积的。我不知道如何在基于集合的解决方案中进行设置,以便我可以看到当天的名称。
我希望能够看到诸如“每 3 天执行一次”或“每周一、二、五执行”之类的内容。
我怎样才能写这个,这样我就不会使用多层 case 语句来得到我想要的东西?
到目前为止,这是我的代码:
select
j.job_id,
j.name,
s.next_run_date,
s.next_run_time,
ss.*
from msdb.dbo.sysjobs j
left outer join msdb.dbo.sysjobschedules s
on j.job_id=s.job_id
left outer join msdb.dbo.sysschedules ss
on s.schedule_id=ss.schedule_id
where j.name like 'backup.%'
Run Code Online (Sandbox Code Playgroud) sql-server-2005 ×10
sql-server ×5
deadlock ×1
delete ×1
hierarchy ×1
process ×1
sqlcmd ×1
statistics ×1