[英]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.