我需要合并来自不同表的多个列。我的代码需要永远查询。这是合并多个表的正确方法吗?有没有更有效的方法来做到这一点。我正在使用PostgreSQL 9.6.5。
SELECT
i.id, i.hdm_id, i.tos,
c.itemid, c.cid,
pr.code,
p.lag
FROM Table1 i
JOIN Table2 c ON
i.id = c.id
JOIN Table3 pr ON
c.id = pr.id
JOIN Table4 p ON
pr.id = p.id ;
答案 0 :(得分:1)
我会尝试创建覆盖查询的索引
create index ix_table1 on table1(id, hdm_id, tos)
create index ix_table2 on table2(id, itemid)
create index ix_table3 on table3(id, code)
create index ix_table4 on table4(id, lag)
你应该认真考虑这种查询的必要性。你真的需要所有数据吗?
答案 1 :(得分:1)
你的问题不是JOINS。它也不缺少索引(尽管它们可能有所帮助,所以请研究那些)。你的问题是,你不分青红皂白地加入4个表并将它们全部选中。根据每个行的行数,这需要一段时间才能执行。
我建议你缩小这些表中实际需要的内容(比如在适当的情况下使用WHERE语句控制所需的数据)。
您还可以在Postgresql中创建Materialized View。这类似于普通视图,但查询结果存储在运行之间,因此如果数据同时没有变化,则多次运行会更快。这些的缺点是你不能直接更新/删除/插入它们,所以你必须要记住这一点。
答案 2 :(得分:0)
我建议遵循以下事项:
1)检查索引碎片并按照此处提到的步骤进行操作 - https://docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes
2)在使用JOINS时,您还应该考虑表的顺序。无论哪个表的记录数量较少,请先使用该表。因此,下一个后续连接将有更少的记录要过滤。
3)如果表有任何索引(在这种情况下除了Id之外),请使用适当的索引。
希望这有帮助。
此致 尊利
答案 3 :(得分:0)
你试过直接将Table1的i.id连接到i.id的另一个表吗?你正在做一些不同的事情。您将Table1.id连接到table2.id。然后Table2.id到Table3.id。然后Table3.id到Table4.id。尝试直接加入表1:
SELECT
i.id, i.hdm_id, i.tos,
c.itemid, c.cid,
pr.code,
p.lag
FROM Table1 i
JOIN Table2 c ON
i.id = c.id
JOIN Table3 pr ON
i.id = pr.id
JOIN Table4 p ON
i.id = p.id ;