【问题标题】:SQL Server - What happens when a row in a table is updated?SQL Server - 更新表中的行时会发生什么?
【发布时间】:2023-03-21 15:55:01
【问题描述】:

我似乎记得,当更新表中的行时,SQL Server 首先删除该行,然后重新添加该行,如果存在这样的列,则该行具有相同的列标识值。谁能证实这一点?

【问题讨论】:

  • 我很好奇你们为什么好奇兰迪为什么好奇。这是一种很好的学习方式。
  • @LeeGunn - 我来学习了,在我工作的 3 或 4 年里,很多人对真正回答问题并不感兴趣。他们只是对争论感兴趣。我学会了忽略这些人。

标签: sql-server


【解决方案1】:

错误。在大多数情况下,数据会在同一页面内就地更改。使用 SQL Server 2008,您实际上可以询问数据在磁盘上的位置,这将显示出同样多的信息。

现在真的看过了,我把它全部收回:

http://www.sqlskills.com/BLOGS/PAUL/category/On-Disk-Structures.aspx

这可以在 SQL Server 2008 上轻松测试。(代码从链接文章修改)

CREATE TABLE test (c1 INT, c2 VARCHAR (2000));
GO
CREATE CLUSTERED INDEX test_cl ON test (c1);
GO
CHECKPOINT;
GO
INSERT INTO test VALUES (1, REPLICATE ('Paul', 500));
GO
CHECKPOINT;
select %%physloc%%, * from test    -- 0x3E01000001000000
GO
UPDATE test SET c1 = 2 WHERE c1 =1;
GO
select %%physloc%%, * from test    -- 0x3E01000001000100
                                                     ^
                                                     |
                                    notice it has changed location

【讨论】:

  • +1 所有 SQLSkills 博客都应该被任何使用 SQL Server 的人收藏。
  • 运行您的示例时,每个 %%physloc%% Select 语句都会出现 SQL Server 错误。消息 102,级别 15,状态 3,第 2 行 'physloc' 附近的语法不正确。
  • @Randy 这可以在 SQL Server 上轻松测试 2008 链接的文章确实指出此行为仅影响对群集键的更改并适用到 2005 年以上
  • +1 您可以使用sys.fn_PhysLocFormatter(%%physloc%%) 获得更易读的输出(提供文件:页面:插槽)
  • sqlskills.com/blogs/paul/… 似乎是一个更好的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2014-03-02
  • 2023-03-29
  • 2016-02-20
  • 1970-01-01
相关资源
最近更新 更多