使用 PostgreSQL 的某程序在一个临时表里存放验证数据,用过之后即 truncate 该表。可是今天下午突然许多 truncate 的进程都在那儿不动了。怀疑跟正在进行的 pg_dump 有关系,后来同事通过这个网页提供的查询语句,发现果然是 pg_dump 导致的。
pg_dump 似乎会给数据库里所有的表加一个 access share lock. 而 truncate 需要对所操作的表加一个 access exclusive lock,于是它就等啊等。可是对很大的数据库,pg_dump 可是一时半会做不完的。
发现这个问题以后,我临时把哪个程序里的 truncate 语句改成 delete from 让它可以继续进行它的工作。
同事不只一次告诉我,truncate 是 DDL,而 delete 是 DML.
truncate 一般很快,而 delete 可能很慢,即使不加条件。
truncate 完成后,省下的空间立即回收。而 delete 掉的行所占用的空间不会立即被回收,需要等 vacuum 的时候。
好在这些临时表一直数据很少,所以 truncate 和 delete 不会差别太大。
Leave a Reply