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_code
和 persal_number
在 powwowpersalmapping
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, '') = ''
.
我正在使用 Postgres。
架构
+------------+ +-----------+ +---------------------+
| employee | | contact | | powwowpersalmapping |
+------------+ +-----------+ +---------------------+
| member_id | | member_id | | id_number |
| staff_code | | idnumber | | persal_number |
+------------+ +-----------+ +---------------------+
数据
目标
如您所见,staff_code
是空白的,所以我尝试在 employee
table 上设置 staff_code
和 persal_number
在 powwowpersalmapping
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, '') = ''
.