【问题标题】:SQL - What order does update work on a table, is it guaranteed?SQL - 更新在表上工作的顺序是什么,有保证吗?
【发布时间】:2012-03-20 21:57:55
【问题描述】:

我环顾四周,似乎找不到答案,但如果我公然忽略了它,请随时直接指出它。

我有一个更新表的查询。更新取决于表的顺序。

SQL 更新语句是否直接在表中逐行工作? Update 语句是直接从表中查看每一行,还是从开始时执行的表的“缓存选择”中查看每一行。我的数据在表格中呈级联形式,但我不确定它是否能正常工作。

其次,要执行此更新,我使用Update - From 语句,其中表连接到另一个,然后返回到自身。 order by 语句会在更新发生之前对数据进行排序,还是执行其他操作?

我使用的是 SQL Server 2008 r2。

更新:这与我问的另一个问题 here 有关。 该更新适用于如下所示的数据:

Id1    Id2
-----------
100    50
120    70
70     50
34     20
50     40
40     10

总体而言,应该将信息从 Id1 更新到 Id2,以便上述更新可以有效更新以下数据,这是上述数据的缩减:

Id1    Id2
-----------
100    10
120    10
34     20

我看过它并假设,'嘿,如果它在 desc 中从上到下工作,则无需担心这样做,因为更新将按顺序发生并执行。但显然这是不正确的。

【问题讨论】:

  • 没有“表格的顺序
  • 确实,我知道(在你提醒我之后!),我想我要问的是我能保证更新的某种订单吗?
  • 你能不能不使用 SQL Management Studio 中的执行计划来查看查询将如何执行以及以什么顺序执行?
  • 行物理更新的顺序通常不重要。如果您尝试做一些依赖于行的更新后版本的事情,那么它很可能不起作用。 SQL Server 将使用行的更新前版本。它可以产生影响的一个例外是使用“古怪的更新”技术。 Jeff Moden 有一个先决条件列表which he asserts 将保证更新按聚集索引键顺序进行。
  • '从桌面向下级联'怎么做?对于需要这种行为类型的任何应用程序,我都会持怀疑态度,尤其是如果您曾经想要在多线程环境中执行处理。通常,您会想要为此使用 OLAP 函数...

标签: sql sql-server-2008 sql-update


【解决方案1】:

如果您需要按特定顺序更新,请使用游标:

declare myCursor cursor
for select * from myTable1 t1
inner join myTable2 t2 on t1.id = t2.fid
order by t1.id  /* <==== */
for update of t1.col1, t1.col2

open myCursor
fetch next from myCursor /* optional into clause */
while @@fetch_status = 0
begin
    update myCursor set col1 = /* Some expression */, col2 = /* Some expression */
    fetch next from myCursor  /* optional into clause */
end
close myCursor 
deallocate myCursor 

【讨论】:

  • 扩展时这对性能有很大影响吗?我正在查看大约 300 万行,索引良好,在一个好的服务器上,所以问题不大,希望
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
相关资源
最近更新 更多