sal*_*ire 7 sql database postgresql transactions
假设我正在开发一个ETL,它定期从CSV中读取源数据并替换Postgres中的表(9.6).
这是一种方法:
BEGIN
DROP TABLE IF EXISTS table
CREATE TABLE table (...)
COPY table FROM STDIN (FORMAT csv, HEADER true)
CREATE INDEX ON table (...)
COMMIT
这是另一个:
BEGIN
CREATE TABLE table_temp (...)
COPY table_temp FROM STDIN (FORMAT csv, HEADER true)
CREATE INDEX ON table_temp (...)
DROP TABLE IF EXISTS table
ALTER TABLE table_temp RENAME TO table
COMMIT
我对以下内容是否正确?
DROP命令的表,因此并发SELECT查询将阻塞,直到事务完成.SELECT查询,直到后COPY和CREATE INDEX光洁度.ROLLBACK而不是COMMIT,那么将使用所有原始数据和索引恢复该表.此外,除了索引的名称,是否还有其他功能差异?
小智 6
是的,您的所有三个假设都是正确的。
对于这两个事务,最终结果将是相同的,但是由第一个事务引起的阻塞将更长,并且取决于数据量和创建索引所花费的时间。第二个事务将需要一个非常简短的锁来重命名对象。