我正在使用 PostgreSQL 8.1.4。我有 3 个表:一个是核心表(表 1),其他表是从属表(表 2、表 3)。我在 table1 中插入了 70000 条记录,并在其他 2 个表中插入了适当的相关记录。因为我使用了 CASCADE,所以我可以使用 DELETE FROM table1 删除相关记录;当我当前的 PostgreSQL 版本中的记录最少时,它工作正常。当我有大量记录时,它会尝试删除所有记录,但是好几个小时都没有删除进度的迹象!而批量导入,只需几分钟即可完成。我希望在合理的时间内进行批量删除。我也试过截断。比如,TRUNCATE table3, table2,table1;虽然性能没有变化。只是需要更多时间,而且没有完成的迹象!从网上,我得到的选项很少,比如删除所有约束然后重新创建它们就可以了。但是,当加载更多数据时,似乎没有任何查询成功运行在“table1”上! 请向我推荐在几分钟内删除所有记录的最佳解决方案。
CREATE TABLE table1(
t1_id SERIAL PRIMARY KEY,
disp_name TEXT NOT NULL DEFAULT '',
last_updated TIMESTAMP NOT NULL DEFAULT current_timestamp,
UNIQUE(disp_name)
) WITHOUT OIDS;
CREATE UNIQUE INDEX disp_name_index on table1(upper(disp_name));
CREATE TABLE table2 (
t2_id SERIAL PRIMARY KEY,
t1_id INTEGER REFERENCES table1 ON DELETE CASCADE,
type TEXT
) WITHOUT OIDS;
CREATE TABLE table3 (
t3_id SERIAL PRIMARY KEY,
t1_id INTEGER REFERENCES table1 ON DELETE CASCADE,
config_key TEXT,
config_value TEXT
) WITHOUT OIDS;
问候, 湿婆。
最佳答案
您可以在引用父表的子表的列上创建索引:
在表 2 的 t1_id 列上创建索引
在表 3 的 t1_id 列上创建索引
这应该会稍微加快速度。
和/或者,不要理会on delete cascade
,制作一个删除存储过程,先从子表中删除,然后从父表中删除,它可能比让 postgresql 更快为你做。
关于sql - 请推荐最好的批量删除选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172101/