带有无效查询的数据库表损坏:它做了什么并将回滚?

Bob*_*bst 4 sql sql-server data-warehouse

我犯了错误,运行应该对我的事实表(200M行)进行快速更新:

update dbo.primary_fact
   set count_of_loan_obligors = o.n              
  from dbo.staging_fact f  
       -- notice that this is not the same table as the one in the update clause
       inner join ##Obligor_Count o
       on (f.time_dimension_id = o.time_dimension_id
           and f.account_dimension_id = o.account_dimension_id)
Run Code Online (Sandbox Code Playgroud)

应该是:

  from dbo.primary_fact f
Run Code Online (Sandbox Code Playgroud)

这样一个正确形成的更新(1天,87k账户)通常在一分钟或2分钟结束.运行12分钟后,我想知道这么长时间内发现了我的错误.

我取消了SQL Server Management Studio中的查询,据我所知,它会回滚所有可怕的(有人确认吗?)

但我更大的问题是:错误形成的查询有什么作用?


更新:取消操作最终完成,一小时39分钟后.DBA在杀戮上的速度太慢 - 同样如此.

正确形成的更新在8秒内完成.

第二次更新:在SSMS中成功取消订单后,原始(错误)更新中未设置任何值.我会解释这意味着任何挂起的更新都会被回滚.

Mik*_*son 5

但我更大的问题是:错误形成的查询有什么作用?

它将dbo.primary_fact.count_of_loan_obligors使用相同的值更新所有行.该值将是一些值##Obligor_Count.n.很难弄清楚会是什么价值.

这是一个小测试,基本上做你做的:

declare @T1 table (ID int)
declare @T2 table (ID int)

insert into @T1 values (0)
insert into @T1 values (0)

insert into @T2 values (2)
insert into @T2 values (1)

update @T1
set ID = T2.ID
from @T2 as T2

select *
from @T1
Run Code Online (Sandbox Code Playgroud)

结果:

ID
2
2
Run Code Online (Sandbox Code Playgroud)

在这种情况下@T1,使用第一行更新@T2.