【发布时间】:2019-01-12 06:24:59
【问题描述】:
我正在尝试更新 pSQL 中的表并得到各种内存/执行错误。
奇怪的是,支持更新的 SELECT 查询非常快。我确定我只是不明白幕后发生了什么。
一些上下文。
相关表格
address_book:
loan_id,
county,
zip
---
loan:
id
---
loan_property:
loan_id,
property_id
---
property:
id,
zip,
county
目标
目标是使用 address_book 中的值更新属性表的 zip 和 county。 address_book 有一个 loan_id,它是属性的连接。
SQL
我们来看一个简单的SELECT
WITH ab AS (
SELECT DISTINCT
left(ab.loan_id, 6) AS loan_id,
ab.zip AS zip,
ab.county AS county
FROM
address_book ab
WHERE
ab.address IS NOT NULL
)
SELECT ab.county, p.name
FROM property p
INNER JOIN loan_property lp ON lp.property_id = p.id
INNER JOIN loan l ON lp.loan_id = l.id
INNER JOIN ab ON ab.loan_id = l.id
WHERE
l.id = ab.loan_id
这非常有效并且非常快(大约 10k 条记录上 0.4 秒)
让我们把上面的内容变成一个 UPDATE 调用:
WITH ab AS (
SELECT DISTINCT
left(ab.loan_id, 6) AS loan_id,
ab.zip AS zip,
ab.county AS county
FROM
address_book ab
WHERE
ab.address IS NOT NULL
)
UPDATE property
SET zip=ab.zip, county=ab.county
FROM property p
INNER JOIN loan_property lp ON lp.property_id = p.id
INNER JOIN loan l ON lp.loan_id = l.id
INNER JOIN ab ON ab.loan_id = l.id
WHERE
l.id = ab.loan_id
此更新运行 2 分钟,然后通常会失败
SQL 错误 [53200]:错误:内存不足
是否有更优化的方式来运行此更新?即使我必须通过 LIMIT/OFFSET 进行批处理或将 SELECT 结果保存到表中,然后直接从该表执行更新 - 有什么方法可以运行此更新而不会遇到内存错误?
非常感谢大家!
【问题讨论】:
标签: sql postgresql psql