Postgres慢速运行删除查询

inf*_*oop 3 postgresql foreign-keys postgresql-performance sql-delete

我们有一个超过62k行的表.我们正在运行一个非常简单的删除查询,需要45分钟才能完成:

DELETE FROM myTable WHERE createdtime < '2017-03-07 05:00:00.000'
Run Code Online (Sandbox Code Playgroud)

我们尝试过的事情:

1-在timestamp列上添加了一个索引,但没有帮助.

2-使用函数分批删除20或50行,这仍然非常慢.

3-删除引用此表及其自己的主键约束的所有外键约束,这有助于将时间减少到几秒但我们无法在生产数据库上安全地执行此操作,因为它将锁定表并防止读取并在事务运行时写入.

我拒绝相信这个查询通常需要很长时间才能完成.任何建议表示赞赏.

joo*_*oop 13

... Dropped all the foreign key constraints referencing this table

确保这些FK具有支持它们的索引(在另一个表上).删除时,(级联)FK必须检查可以引用此行的其他表中的所有FK列.


- 例子:

CREATE TABLE team(
        id INTEGER NOT NULL PRIMARY KEY
        , name varchar UNIQUE
        );

CREATE TABLE player(
        id INTEGER NOT NULL PRIMARY KEY
        , team_id integer REFERENCES team(id)
        , name varchar UNIQUE
        );
Run Code Online (Sandbox Code Playgroud)

现在,如果a team被删除,FK约束将必须检查是否有任何参与此的玩家team_id.(并且适当地级联)在这种情况下,FK的支持性索引将有助于DBMS:

CREATE index ON player(team_id);
Run Code Online (Sandbox Code Playgroud)

这里的帮助有点太弱了.每个非平凡案例都绝对需要一个支持性指数.(即使FK约束有ON UPDATE NO ACTION ON DELETE NO ACTION动作,所以看起来如此)

  • @infiniteLoop:不,该条件决定了应该采取哪个操作 _if_ 子行存在 - 但如果存在外键,则必须**对子行进行测试 (2认同)