如果您的设置允许,只需重命名旧表并创建一个新的空表。显然,速度要快得多,因为根本不进行复制。
ALTER TABLE log_a RENAME TO log_b;
CREATE TABLE log_a (LIKE log_b INCLUDING ALL);
该LIKE
子句复制(现已重命名的)旧表的结构。INCLUDING ALL
包括默认值、约束、索引、...
取决于表或其他不太常见的依赖项(但不是 plpgsql 函数中的查询)的外键约束或视图可能是这条路线的障碍。您必须重新创建它们以使它们指向新表。但是像您描述的日志表可能不包含这样的依赖关系。
这将获得表上的排他锁。我认为,典型的写访问权限INSERT
仅适用于您的情况?处理并发访问的一种方法是在不同的模式search_path
中创建新表并为您的应用程序用户更改表。然后应用程序开始写入新表而不会出现并发问题。当然,您不会在INSERT
语句中对表名进行模式限定以使其生效。
CREATE SCHEMA log20121018;
CREATE TABLE log20121018.log_a (LIKE log20121011.log_a INCLUDING ALL);
ALTER ROLE myrole SET search_path = app, log20121018, public;
search_path
或者在对您有效的任何级别更改设置:全局、每个数据库、每个角色、每个会话、每个功能......