Roe*_*ler 62 sql sql-insert sql-delete
假设我有一个包含以下字段的简单表:
我从不使用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服务器进行了测试,我使用过:
运行500次循环测试后,我得到了以下结果:
DEL + INSERT - 平均:62ms
更新 - 平均:30毫秒
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)
我担心你的问题正文与标题问题无关.
如果要回答标题:
在SQL中,UPDATE总是快于DELETE + INSERT吗?
然后回答不是!
只是google for
与直接插入+更新相比,这种更新通过插入+更新导致更高成本(更多处理)的更新实现.这些是时候的情况
我的快速(非详尽)搜索,而不是假装覆盖一个,给了我[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
请记住,当发出 DELETE+INSERT 与正确实现的 UPDATE 相对时发生的实际碎片将随着时间产生很大的不同。
这就是为什么,例如,不鼓励使用 MySQL 实现的 REPLACE INTO,而不是使用 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 语法。
小智 5
刚刚尝试在包含44个字段的表上更新43个字段,其余字段是主要的群集密钥.
更新耗时8秒.
删除+插入比"客户端统计"通过SQL Management Studio报告的最小时间间隔快.
彼得
MS SQL 2008
如果没有特定的速度问题,速度问题就无关紧要。
如果您正在编写 SQL 代码来更改现有行,请更新它。其他任何内容都是不正确的。
如果你要打破代码应该如何工作的规则,那么你最好有一个非常好的、量化的理由,而不是一个模糊的想法“这种方式更快”,当你没有任何理由时知道什么是“更快”。
归档时间: |
|
查看次数: |
98940 次 |
最近记录: |