在SQL中,UPDATE总是快于DELETE + INSERT吗?

Roe*_*ler 62 sql sql-insert sql-delete

假设我有一个包含以下字段的简单表:

  1. ID:int,autoincremental(identity),主键
  2. 名称:varchar(50),唯一,具有唯一索引
  3. 标签:int

我从不使用ID字段进行查找,因为我的应用程序总是基于使用Name字段.

我需要不时更改Tag值.我正在使用以下简单的SQL代码:

UPDATE Table SET Tag = XX WHERE Name = YY;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人知道上述内容总是比以下更快:

DELETE FROM Table WHERE Name = YY;
INSERT INTO Table (Name, Tag) VALUES (YY, XX);
Run Code Online (Sandbox Code Playgroud)

再次 - 我知道在第二个例子中ID被更改,但它对我的应用程序无关紧要.

Dyp*_*den 65

这个答案有点太晚了,但是由于我遇到了类似的问题,我在同一台机器上使用JMeter和MySQL服务器进行了测试,我使用过:

  1. 包含两个JDBC请求的事务控制器(生成父样本):Delete和Insert语句
  2. 包含Update语句的sepparate JDBC Request.

运行500次循环测试后,我得到了以下结果:

DEL + INSERT - 平均:62ms

更新 - 平均:30毫秒

结果: 结果

  • 我很想看到具有大型数据集和索引的相同统计数据。 (2认同)

APC*_*APC 36

表(列的数量和大小)越大,删除和插入而不是更新就越昂贵.因为你必须支付UNDO和REDO的价格.DELETE比UPDATE消耗更多的UNDO空间,并且您的REDO包含两倍于必要的语句.

此外,从商业角度来看,这是完全错误的.考虑理解该表上的名义审计线索要困难得多.


有些情况涉及表中所有行的批量更新,其中使用旧表中的CTAS创建新表更快(在SELECT子句的投影中应用更新),删除旧表并重命名新表.副作用是创建索引,管理约束和更新权限,但值得考虑.


KM.*_*KM. 12

同一行上的一个命令应始终比同一行上的两个命令快.所以UPDATE只会更好.

编辑 设置表:

create table YourTable
(YourName  varchar(50)  primary key
,Tag int
)

insert into YourTable values ('first value',1)
Run Code Online (Sandbox Code Playgroud)

运行这个,我的系统需要1秒钟(sql server 2005):

SET NOCOUNT ON
declare @x int
declare @y int
select @x=0,@y=0
UPDATE YourTable set YourName='new name'
while @x<10000
begin
    Set @x=@x+1
    update YourTable set YourName='new name' where YourName='new name'
    SET @y=@y+@@ROWCOUNT
end
print @y
Run Code Online (Sandbox Code Playgroud)

运行这个,我的系统需要2秒钟:

SET NOCOUNT ON
declare @x int
declare @y int
select @x=0,@y=0
while @x<10000
begin
    Set @x=@x+1
    DELETE YourTable WHERE YourName='new name'
    insert into YourTable values ('new name',1)
    SET @y=@y+@@ROWCOUNT
end
print @y
Run Code Online (Sandbox Code Playgroud)

  • 您是基于任何具体数据吗? (4认同)
  • @Rax Olgud,在删除和创建索引值以及检查任何约束方面存在一些开销.如果您只是更新数据列,它将避免任何这种开销. (2认同)

Gen*_*нин 8

我担心你的问题正文与标题问题无关.

如果要回答标题:

在SQL中,UPDATE总是快于DELETE + INSERT吗?

然后回答不是!

只是google for

  • "昂贵的直接更新"*"sql server"
  • "延迟更新"*"sql server"

与直接插入+更新相比,这种更新通过插入+更新导致更高成本(更多处理)的更新实现.这些是时候的情况

  • 一个用唯一(或主要)键或更新字段
  • 当新数据在分配的更新前行空间(或甚至最大行大小)中不适合(更大)时,会导致碎片,
  • 等等

我的快速(非详尽)搜索,而不是假装覆盖一个,给了我[1],[2]

[1]
更新操作
(Sybase®SQLServer性能和调优指南
第7章:SQL Server查询优化程序)
http://www.lcard.ru/~nail/sybase/perf/11500.htm
[2]
更新语句可能是复制为DELETE/INSERT对
http://support.microsoft.com/kb/238254


jis*_*shi 5

请记住,当发出 DELETE+INSERT 与正确实现的 UPDATE 相对时发生的实际碎片将随着时间产生很大的不同。

这就是为什么,例如,不鼓励使用 MySQL 实现的 REPLACE INTO,而不是使用 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 语法。


小智 5

刚刚尝试在包含44个字段的表上更新43个字段,其余字段是主要的群集密钥.

更新耗时8秒.

删除+插入比"客户端统计"通过SQL Management Studio报告的最小时间间隔快.

彼得

MS SQL 2008


And*_*ter 5

如果没有特定的速度问题,速度问题就无关紧要。

如果您正在编写 SQL 代码来更改现有行,请更新它。其他任何内容都是不正确的。

如果你要打破代码应该如何工作的规则,那么你最好有一个非常好的、量化的理由,而不是一个模糊的想法“这种方式更快”,当你没有任何理由时知道什么是“更快”。