Database 使用相同值更新主键时的性能影响

Database 使用相同值更新主键时的性能影响,database,oracle,Database,Oracle,在工作中,我看到查询将用相同的值更新表主键。这里有一个例子。当我执行以下操作时,会对数据库性能产生什么影响- update t set id=1,content='ccc' where id=1; 我希望索引不会被修改,因为键值是相同的。不过,我相信它将使用更多的资源,而不仅仅是更新内容栏本身。我说得对吗 Table t (id is primary key) id content 1 xxx 2 yyy 是的,您是对的,索引不会被修改,因为主键(自然索引)列的值与其索引相同 还有,

在工作中,我看到查询将用相同的值更新表主键。这里有一个例子。当我执行以下操作时,会对数据库性能产生什么影响-

update t set id=1,content='ccc' 
where id=1; 
我希望索引不会被修改,因为键值是相同的。不过,我相信它将使用更多的资源,而不仅仅是更新内容栏本身。我说得对吗

Table t (id is primary key)
id content
1  xxx
2  yyy

是的,您是对的,索引不会被修改,因为主键(自然索引)列的值与其索引相同

还有,这个更新

update t set id=1,content='ccc' 
where id=1; 
消耗的资源比消耗的资源多吗

update t set content='ccc' 
where id=1; 
因为,更新索引列比更新非索引列慢

下面是一个例子

SQL>创建表a(b数字,c varchar2(50));
SQL>设置定时;
SQL>插入a(b)通过级别更新a集合c=ascii(b)从双连接中选择rownum;
更新了1000000行。
已过时间:00:00:46.72
SQL>commit;
提交完成。
已过时间:00:00:00.03
SQL>截断表a;
表被截断。
已过时间:00:00:01.33
SQL>插入a(b)从双连接中选择rownum,按级别提交;
提交完成。
已过时间:00:00:00.03
SQL>在上创建索引idx_c;
已创建索引。
已过时间:00:00:00.46
SQL>更新集合c=ascii(b);
更新了1000000行。
已过时间:00:01:53.12
SQL>commit;
提交完成。
已过时间:00:00:00.04

这正是我所期望的。你知道演示的方法吗?我的主管想看看确凿的证据。@LuyinSun好的,我给我的朋友加了一个例子。顺便说一下,我把ascii函数和chr混淆了,你可以试试这个。谢谢Barbaros。我现在有了主意。这是我的实验结果。看来更新主键不一定会花费更多。我不知道为什么时间不一致。SQL>更新测试集内容=内容;SQL>910000行更新在32.23秒内执行SQL>commit;提交完成在0.016秒内执行SQL>更新测试集id=id,内容=content;910000行更新在22.418秒内执行SQL>commit;提交完成在0秒内执行SQL>更新测试集id=id,内容=content;SQL>910000行更新执行时间为27.55秒SQL>commit;提交完成在0秒内执行SQL>更新测试集内容=内容;910000行更新在24.242秒内执行SQL>commit;提交完成在0秒内执行
SQL> create table a ( b numeric, c varchar2(50) );
SQL> set timing on;
SQL> insert into a(b) select rownum from dual connect by level <= 1000000;      
     1000000 rows created.
     Elapsed: 00:00:02.74

SQL> update a set c=ascii(b);
     1000000 rows updated.
     Elapsed: 00:00:46.72

SQL> commit;
     Commit complete.
     Elapsed: 00:00:00.03

SQL> truncate table a;
     Table truncated.
     Elapsed: 00:00:01.33

SQL> insert into a(b) select rownum from dual connect by level <= 1000000;      
     1000000 rows created.
     Elapsed: 00:00:00.80 

SQL> commit;
     Commit complete.
     Elapsed: 00:00:00.03

SQL> create index idx_c on a;
     Index created.
     Elapsed: 00:00:00.46

SQL> update a set c=ascii(b);
     1000000 rows updated.
     Elapsed: 00:01:53.12

SQL> commit;
     Commit complete.
     Elapsed: 00:00:00.04