Nói chung, cách nhanh nhất để sao chép bảng chỉ đơn giản là:
CREATE TABLE table2 AS SELECT * FROM table1;
Các INSERT song song có thể nhanh hơn, nhưng chỉ với một hệ thống con đĩa rất nhanh (khi dữ liệu được xen kẽ trên nhiều ổ đĩa). Nếu không thì điều này sẽ chậm hơn.
Khi bạn đã hoàn tất việc sửa đổi table2
, nó có thể lấy tên mới bằng:
BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
Các DROP TABLE
lệnh cần một khóa độc quyền, làm ảnh hưởng đến bạn đọc đồng thời trong một cách mà bạn có thể muốn dự đoán:
DROP
sẽ chờ cho bất kỳ đọc đang chờ xử lý trên bảng từ các giao dịch khác để kết thúc.
- Bất kỳ giao dịch mới nào cố gắng đọc bảng đó trong thời gian đó sẽ được đặt trong trạng thái chờ, và sau đó thất bại do bản gốc
table1
không còn tồn tại. Lỗi sẽ giống như "không thể mở quan hệ với OID oid "
Để tránh vấn đề thứ hai, bạn có thể đổi tên table1
thành old_table1
thay vì bỏ nó và sau đó chỉ thả nó sau giao dịch, khi những độc giả này đã hoàn thành nó. Vì vậy, chuỗi trên sẽ trở thành:
BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;