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