- 论坛徽章:
- 3
|
本帖最后由 osdba 于 2011-02-23 10:36 编辑
这个更新慢的问题仅存在于你这种做测试的这个特殊场景中。一般的业务情况下,这个问题是不存在的,只要不在你这个特殊的测试场景中,PostgreSQL更新是很快的。
我前面写的原因,你可能没有仔细看,这里再做一个详细说明:
慢的原因是你在一个事务中多次对同一条数据进行更新,而对这同一条记录的更新,而你一直不提交,导致vacuum一直不能对这个表做清理,于是后面的更新时,需要找到当前最新版本的记录时花了很长时间。如果你更新100条就提交一次,这样就有可能让vacuum来整理这个表的多版本数据,那么后面更新也会快很多。当然如果你的表中是有很多条记录,如10000条记录,表上再有索引时,每次更新时都是选不同的记录时,这样找到要更新的记录会很快,那么这样的更新也是会很快的。
见我下面的测试:
我先建两个表sno1和sno2,表sno1中只有一条数据,而sno2中有10000条数据,对sno1更新100000次,而对sno2表也更新100000次,但由于sno2有10000条记录,所有每条记录只更新了10次,下面的测试可以看到对sno1的更新很慢,花了169秒,而对sno2的更新只花了4.5秒:
create table sno1(sno int );
insert into sno1 values(1);
create or replace function updatetest1() RETURNS VOID AS
$$
declare
i int;
BEGIN
i := 1;
while i <= 100000 loop
update sno1 set sno = sno +1;
i := i + 1;
end loop;
end;
$$
LANGUAGE plpgsql;
create table sno2(id int primary key,sno int );
insert into sno2 select generate_series(1,10000),1;
create or replace function updatetest2() RETURNS VOID AS
$$
declare
i int;
n int;
BEGIN
i := 1;
n := 1;
while i <= 100000 loop
update sno2 set sno = sno +1 where id=n;
i := i + 1;
n := n + 1;
IF n> 10000 THEN
n := 1;
END IF;
end loop;
end;
$$
LANGUAGE plpgsql;
osdba=# select updatetest1();
updatetest1
-------------
(1 row)
Time: 169260.575 ms
osdba=# select updatetest2();
updatetest2
-------------
(1 row)
Time: 4544.237 ms
osdba=# |
|