广州做企业网站的公司,哪个网站网站空间最好,用文字写美食个人网站设计作品,上海网站制作顾PostgreSQL数据库的MVCC机制中,一个明显的特点是,在执行DELETE操作,它一般并不立即擦除要删的数据,通常只是做一个标记,留给VACUUM进程去做相应的清理,并且是有条件的清理。
而UPDATE操作,则更是一个DELETE操作和一个INSERT操作的组合。INSERT操作则通常会APPEND一条记…PostgreSQL数据库的MVCC机制中,一个明显的特点是,在执行DELETE操作,它一般并不立即擦除要删的数据,通常只是做一个标记,留给VACUUM进程去做相应的清理,并且是有条件的清理。
而UPDATE操作,则更是一个DELETE操作和一个INSERT操作的组合。INSERT操作则通常会APPEND一条记录在后边。这样的结果是,通常情况下,这种INSERT, UPDATE操作应该是很快的。但如果用的不当,也有一些反例:
下面看一则很普通的示例:
createtablet3(idint);
insertintot3values(1);
begin;
\setVERBOSEverbose
dolanguageplpgsql$$
declare
tcountint=100000;
begin
foriin1..tcountloop
updatet3setid=id+1;
endloop;
end;
$$;
commit;DO
Time:120762.618ms(02:00.763)
mydb=*#commit;我们可以明显的看到,一条普通的记录,在更新100000次的操作下,居然花了整整两分钟。
我们用下边的SQL来看看该表的元组分布情况:(将其中的public.t3改为你想要的表名,就可以查目标表的相应情况)
WITHcteTableInfoAS
(
SELECT
COUNT(1)ASct
,SUM(length(t::text))ASTextLength
,'public.t3'::regclassASTableName
FROMpublic.t3ASt
)
,cteRowSizeAS
(
SELECTARRAY[pg_relation_size(TableName)
,pg_relation_size(TableName,'vm')
,pg_relation_size(TableName,'fsm')
,pg_table_size(TableName)
,pg_indexes_size(TableName)
,pg_total_relation_size(TableName)
,TextLength
]ASval
,ARRAY['RelationSize'
,'VisibilityMap'
,'FreeSpaceMap'
,'TableIncludedToastSize'
,'IndexesSize'
,'TotalRelationSize'
,'LiveRowByteSize'
]ASName
FROMcteTableInfo
)
SELECT
unnest(name)ASDescription
,unnest(val)ASBytes
,pg_size_pretty(unnest(val))ASBytesP