首页 > 解决方案 > PostgreSQL 存储过程性能

问题描述

我使用 PostgreSQL,并且在模式“public”中有一个表“PERSON”,如下所示:

    +----+-------------+-------+----------------------------+
    | id | internal_id | name  | created                    |
    +----+-------------+-------+----------------------------+
    | 1  | P0001-XX00  |  Bob  |  2021-05-24 22:10:01.93025 |
    +----+-------------+-------+----------------------------+
    | 2  | P0001-CX00  |  Tom  |  2021-06-27 22:10:01.93025 |
    +----+-------------+-------+----------------------------+
    | 3  | P0002-XX00  |  Anna |  2021-05-24 22:10:01.93025 |    
    +----+-------------+-------+----------------------------+

id -> bigint; internal_id -> character varying; name -> character varying; created  -> timestamp without timezone

我需要编写删除那些早于固定时间戳的记录的程序,例如:now()。但是一旦找到这样的旧记录,我需要检查表中是否还有其他记录不旧并且与internal_id找到的旧记录具有相同的前 5 个字符。如果有这样的记录,那么我不应该删除旧记录。

所以我用 plpgsql 编写了以下过程,它似乎工作:

BEGIN
DELETE FROM public."PERSON" AS t1
   WHERE t1.created < now()
   AND NOT EXISTS
     (
      SELECT 
      FROM   public."PERSON" AS t2 
      WHERE  left(t2.internal_id, 5) = left(t1.internal_id, 5) 
      AND    t2.created >= now()
     );
COMMIT;
END;

问题:

  1. 它可以变得更正确、更漂亮或更干净吗?也许,不是使用left()函数,而是有必要使用LIKE,或者原则上,以某种不同的方式来做?

  2. 您认为此程序性能正常还是可以改进?

先感谢您!

标签: postgresql

解决方案


那应该工作得很好。

为了获得良好的性能,请创建一个索引:

CREATE INDEX ON public."PERSON" (left(internal_id, 5), created);

推荐阅读