当需要对一些不需要的历史数据进行大批量删除时, 在使用delete语句时,会发现在删除一些数据时会非常慢
比如 DELETE FROM test where id < 10000;
删除缓慢的原因主要在于外键约束,当数据库在有约束的情况下,无论进行删除或者更新操作, 都会对相关表进行一个校验,判断相关表的相关记录是否被删除或者更新。 这个检查的过程会非常慢, 尤其在外建表又关联着外建表的这种层层嵌套的情况下。
遇到的问题
在PostgreSQL 9.2 及以上版本,执行下面的语句:
postgres=# drop database dbtest;
# 执行删除指定数据库的时候,报以下错误
ERROR: database "dbtest" is being accessed by other users
DETAIL: There is 2 other session using the database.
或者使用 Navicat 等第三方数据库连接工具,删除指定数据库的时候报错,说明此时有两个客户端在连接此数据库,此时不能删除数据库。