UPDATE nas_backup
SET fiber_serviceability_class = '0',
last_updated_ts = CURRENT_TIMESTAMP
WHERE location_id IN (
SELECT location_id
FROM (
WITH distinct_locs AS (
SELECT location_id, boundary_type
FROM (
SELECT location_id, boundary_type
FROM nc
WHERE technology_type = 'Fibre'
)
GROUP BY location_id, boundary_type
HAVING COUNT( * ) = 1
)
SELECT nas.location_id
FROM distinct_locs, nas_backup nas
WHERE distinct_locs.location_id = nas.location_id
AND distinct_locs.boundary_type = 'FSA'
GROUP BY nas.location_id
)
);
任何人都可以建议一种优化查询的方法。现在需要5分钟以上。
表nc有1600万条记录,表nas_backup有200万条记录。
答案 0 :(得分:0)
EXISTS
可以帮助你一点。试一试:
UPDATE nas_backup
SET fiber_serviceability_class = '0',
last_updated_ts = CURRENT_TIMESTAMP
-- Remove the IN condition and check only that at least one row exists
WHERE EXISTS (
SELECT location_id
FROM (
WITH distinct_locs AS (
SELECT location_id, boundary_type
FROM (
SELECT location_id, boundary_type
FROM nc
WHERE technology_type = 'Fibre'
)
GROUP BY location_id, boundary_type
HAVING COUNT( * ) = 1
)
SELECT
nas.location_id
FROM
distinct_locs
WHERE
distinct_locs.boundary_type = 'FSA'
-- This is the new line
AND distinct_locs.location_id = nas_backup.location_id
GROUP BY
nas.location_id
)
);
但是,如果您与我们分享您的数据库结构和目标,那么帮助会更容易。
下次请与我们分享您正在使用的DBMS的供应商和版本。
答案 1 :(得分:0)
我在这里说的大部分内容都应该由优秀的优化器完成,所以这主要是为了提高可读性。
您已将所有过滤器应用于位置部分,因此请将其带到子查询以减少结果集:
SELECT location_id, boundary_type
FROM nc
WHERE technology_type = 'Fibre' AND nc.boundary_type='FSA'
GROUP BY location_id, boundary_type
HAVING COUNT(*) = 1
接下来,使用JOIN语法而不是隐式Join:
UPDATE nas fiber_serviceability_class = '0', last_updated_ts = CURRENT_TIMESTAMP
FROM nas_backup nas
JOIN (SELECT location_id, boundary_type
FROM nc
WHERE technology_type = 'Fibre' AND nc.boundary_type='FSA'
GROUP BY location_id, boundary_type
HAVING COUNT(*) = 1) loc ON loc.location_id=nas.location_id
我不知道带有HAVING子句的Subquery是否有特殊原因。在不知道你的结构和数据的情况下,这只是猜测,但也许你并不需要它。这是一个非常简单的查询,然后转换为"更新每个nas_backup,其中技术类型为Fiber,边界类型同时为FSA"。
UPDATE nas fiber_serviceability_class = '0', last_updated_ts = CURRENT_TIMESTAMP
FROM nas_backup nas
JOIN nc ON nas.location_id=nc.location_id
WHERE nc.technology_type='Fibre'
AND nc.boundary_type='FSA'