2017-10-18 84 views
2

我需要合并来自不同表格的多列。我的代码正在永久查询。这是合并多个表的正确方式吗?有没有更有效的方法来做到这一点。我正在使用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

查找索引。 – GurV

+1

索引不会帮助连接整个表 – JustMe

+0

@JustMe是正确的,除非'id'字段是主键,否则它们将被索引。 –

回答

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

你的问题不是连接。它也不会错过索引(虽然它们可能会有所帮助,但请仔细阅读这些索引)。你的问题是你不分青红皂白地加入4张桌子并全部选中。取决于每个行中有多少行,这需要一段时间才能执行。

我建议你从这些表中缩减实际需要的内容(例如在需要时用WHERE语句控制需要的数据)。

您也可以在Postgresql中创建一个Materialized View。它的功能类似普通视图,但查询结果存储在两次运行之间,因此如果数据不会同时发生更改,则多次运行会更快。这些缺点是你不能直接更新/删除/插入它们,所以你不得不介意。

0

我建议以下几点:

1)是否有索引碎片,并按照步骤这里所说 - https://docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes

2)在使用的连接,您应该考虑的表的顺序为好。无论哪个表记录的数量较少,请首先使用该记录。因此,下一个后续联接将具有较少数量的记录进行过滤。

3)如果表中有任何(在本例中为Id除外),请使用适当的索引。

希望这会有所帮助。

问候, 强尼

0

有你尝试过直接加入表1的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 ;