如何从解释中获取Postgresql总成本时间

问题描述 投票:0回答:1

我在PostgreSQL 9.5上有一个sql查询,但是花费的时间太长。然后我运行解释查询:

DELETE FROM source v1
    WHERE id < (SELECT MAX(id)
            FROM source v2
            WHERE v2.ent_id = v1.ent_id
            AND v2.name = v1.name
        );      

和以前是

Delete on source v1  (cost=0.00..1764410287608.21 rows=2891175 width=6)');
  ->  Seq Scan on source v1  (cost=0.00..1764410287608.21 rows=2891175 width=6)');
        Filter: (id < (SubPlan 2))');
        SubPlan 2');
          ->  Result  (cost=203424.76..203424.77 rows=1 width=0)');
                InitPlan 1 (returns $2)');
                  ->  Limit  (cost=0.43..203424.76 rows=1 width=8)');
                        ->  Index Scan Backward using source_id_ix on source v2  (cost=0.43..813697.74 rows=4 width=8)');
                              Index Cond: (id IS NOT NULL)');
                              Filter: (((ent_id)::text = (v1.ent_id)::text) AND ((name)::text = (v1.name)::text))');

我的表有大约8.000.000条记录。而且我几天都没有得到结果。我无法计算需要多少次?有什么办法可以解决新问题?

postgresql sql-delete postgresql-9.5 postgresql-performance
1个回答
0
投票

没有真正好的方法来预测执行时间。

作为一个非常粗略的经验法则,您可以将成本与在顺序扫描期间从磁盘读取一个8 KB页面的时间进行比较,但这通常相差一个数量级。

要解决基本问题,请尝试

DELETE FROM source AS v1
WHERE EXISTS (SELECT 1
              FROM source AS v2
              WHERE (v1.ent_id, v1.name) = (v2.ent_id, v2.name)
              AND v2.id > v1.id);
© www.soinside.com 2019 - 2024. All rights reserved.