我正在使用 PostgreSQL 8.1.4。我有 3 个表:一个是核心表(表 1),其他是从属表(表 2、表 3)。我在表1中插入了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;
问候,
湿婆。
您可以在引用父表的子表上的列上创建索引:
在 table2 的 t1_id 列上创建索引
在 table3 的 t1_id 列上创建索引
这应该会稍微加快速度。
和/或,不要打扰on delete cascade
,创建一个删除存储过程,首先从子表中删除,然后从父表中删除,这可能比让 postgresql 为你做更快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)