postgresql - 由于子查询,查询速度极慢

标签 postgresql

我正在尝试将一些数据移植到一个新结构中,但这让我很费时间。

查询如下:

INSERT INTO atemp_addresses (id, city, state, country_id)
SELECT id, (SELECT name from cities WHERE id=adr.city_id limit 1),
(SELECT name FROM states WHERE id=(SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1), (SELECT country_id FROM states WHERE id=(SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1), FROM addresses adr

因为数据保存在其他表中,我必须使用所有这些子查询,这大大降低了速度。有更快的方法吗?

最佳答案

这是您的查询:

INSERT INTO atemp_addresses (id, city, state, country_id)
    SELECT id,
           (SELECT name from cities WHERE id = adr.city_id limit 1),
           (SELECT name FROM states WHERE id = (SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1),
           (SELECT country_id FROM states WHERE id=(SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1)
    FROM addresses adr;

您反复使用没有ORDER BYLIMIT。这意味着您将获得一个任意匹配行,该行可以从一次调用更改为下一次调用。

等效的查询应该是:

INSERT INTO atemp_addresses (id, city, state, country_id)
    SELECT adr.id, c.name, s.name, s.country_id
    FROM addresses adr JOIN
         cities c
         ON adr.city_id = c.id JOIN
         states s
         ON c.state_id = s.id;

您对 LIMIT 的使用表明可能有多个城市具有相同的 id(数据库设计不佳的标志?)。如果是这样:

INSERT INTO atemp_addresses (id, city, state, country_id)
    SELECT DISTINCT ON (adr.id) adr.id, c.name, s.name, s.country_id
    FROM addresses adr JOIN
         cities c
         ON adr.city_id = c.id JOIN
         states s
         ON c.state_id = s.id 
    ORDER BY adr.id;

关于postgresql - 由于子查询,查询速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32684807/

相关文章:

sql - 搜索具体化路径树的最右侧节点

postgresql - 在 jpa 中重置序列

postgresql - 全文搜索 postgresql : how to substitute 2 letters

java - 使用通用数据库包时找不到驱动程序

python - Web 应用程序中高效的作业进度更新

php - 查询中的问号运算符

sql - postgreSQL 如何获取 UNION 查询的每个 SELECT 返回的元组数?

c++ - 使用 qsql(c++ 和 qt)将数组(二进制数据)插入到 postgres 数据库中

python - 如何使用 SQLAlchemy 和 contains_eager 中关系上定义的 order_by?

sql - 使用 NodeJS 应用程序的 Sequelize 函数在 PostgreSQL 中实现两级聚合