SQL Postgres 查询多个表非常慢

SQL Postgres query very slow with multiple tables

我正在使用 Postgres。

架构

+------------+  +-----------+  +---------------------+
| employee   |  | contact   |  | powwowpersalmapping |
+------------+  +-----------+  +---------------------+
| member_id  |  | member_id |  | id_number           |
| staff_code |  | idnumber  |  | persal_number       |
+------------+  +-----------+  +---------------------+

数据

目标

如您所见,staff_code 是空白的,所以我尝试在 employee table 上设置 staff_codepersal_numberpowwowpersalmapping table.

问题

如何构建 UPDATE 查询以将 persal_number 复制到 staff_code

问题

我正在创建一个 UPDATE 查询,但是等效的 SELECT 查询非常慢,所以我认为 UPDATE 查询也会很慢。

SQL

我有以下内容:

如果我 运行 这个 SELECT 查询与 table 连接。它 运行 非常快。

SELECT e.* FROM employee e
INNER JOIN contact c ON c.member_id = e.member_id 
INNER JOIN powwowpersalmapping m ON m.id_number = c.idnumber
WHERE e.staff_code is null or coalesce(e.staff_code, '') = '';

然后我 运行 这个 SELECT 查询有多个 table(没有连接)。它 运行 非常慢。

SELECT e.* FROM employee e
, contact c, powwowpersalmapping m 
WHERE c.member_id = e.member_id 
AND m.id_number = c.idnumber
AND e.staff_code is null or coalesce(e.staff_code, '') = '';

所以我正在构造一个 UPDATE 查询(还不是 运行),并且到目前为止有以下内容,但我相信它也会很慢。

UPDATE employee e
SET e.staff_code = m.persal_number
FROM contact c, powwowpersalmapping m 
WHERE c.member_id = e.member_id 
AND m.id_number = c.idnumber
AND e.staff_code is null or coalesce(e.staff_code, '') = '';

下面的怎么样?

UPDATE employee e
SET e.staff_code = (
    SELECT m.persal_number FROM employee e
    INNER JOIN contact c ON c.member_id = e.member_id 
    INNER JOIN powwowpersalmapping m ON m.id_number = c.idnumber
    WHERE e.staff_code is null or coalesce(e.staff_code, '') = ''
);

您可以在 FROM 子句之后的 UPDATE 语句中使用联接:

UPDATE employee e
SET staff_code = m.persal_number
FROM contact c INNER JOIN powwowpersalmapping m 
ON m.id_number = c.idnumber
WHERE c.member_id = e.member_id AND COALESCE(e.staff_code, '') = '';

由于 SELECT 查询 运行 很快(我相信所有相关列都有索引)这也将 运行 很快。
如果你也可以去掉 COALESCE() 函数,它会更快。
staff_code 列是否为空?如果是,则删除 AND COALESCE(e.staff_code, '') = ''.