sql - 请推荐最好的批量删除选项

标签 sql postgresql

我正在使用 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/

相关文章:

sql - 需要大量时间的生产 Hadoop 查询

php - 使用 Laravel 上传和显示保存在 PostgreSQL 中的 PDF 文件

regex - 类似 grep 的 postgres 查询

mysql - 如何在一个查询中获取值类别并计算每个类别的产品数量?

sql - Oracle SQL 分析查询 - 递归电子表格式运行总计

java - 为数据库创建实体

PHP SQL SELECT where like 搜索带有多个词的项目

sql - postgresql中的双外键

postgresql - 选择 Postgres 数据库中没有任何空值的记录

sql - 多列索引的顺序和SQL查询