繁体   English   中英

多个表的 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为空,因此我尝试使用staff_code表上的persal_number设置employee表上的powwowpersalmapping

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

在此处输入图片说明

问题

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

SQL

我有以下几点:

如果我使用表连接运行此SELECT查询。 它运行得非常快。

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查询。 它运行得很慢。

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, '') = ''

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM