postgresql - 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;
问题:
它可以变得更正确、更漂亮或更干净吗?也许,不是使用
left()
函数,而是有必要使用LIKE
,或者原则上,以某种不同的方式来做?您认为此程序性能正常还是可以改进?
先感谢您!
解决方案
那应该工作得很好。
为了获得良好的性能,请创建一个索引:
CREATE INDEX ON public."PERSON" (left(internal_id, 5), created);
推荐阅读
- flutter - 在 Ubuntu 18.04.3 LTS 中运行 sdkmanager 后出错
- javascript - javascript通过子文本获取所有div?
- woocommerce - Woocommerce 产品摘要简码
- java - 如何使文本视图可点击到 Android Studio 中的 URL
- mongodb - Docker - Mongo 数据库实例未与应用程序连接
- c# - 如何在动态查询构建方法中使用逻辑替代
- python - 如何替换字符串中一起出现的 2 个或多个特殊字符或下划线 Python
- java - VLCJ:在 VLCJ 中使用 EmbeddedMediaPlayer 和 CallbackVideoSurface 直接渲染消耗高 CPU
- intersystems-cache - Intersystems Caché CSP DIRECTORY_ROOT
- javascript - 使用单选按钮更改网站 URL