2017-10-18 8 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

@ idMeフィールドが主キーであるだけでなく、インデックスされます。 –

答えて

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

あなたの問題はJOINSではありません。インデックスも欠けているわけではありません。あなたの問題は、無差別に4つのテーブルを結合してそれらをすべて選択していることです。それぞれの行の数に応じて、実行に時間がかかります。

これらのテーブルから実際に必要なものを絞り込むことをお勧めします(適切な場合はWHEREステートメントで必要なデータを整理するなど)。

PostgresqlでMaterialized Viewを作成することもできます。これは通常のビューのように機能しますが、クエリの結果はラン間に格納されるため、データが一度に変更されない場合は、複数のランが高速になります。これらの欠点は、直接更新/削除/挿入することができないことです。そのことを気にする必要があります。

0

、私は次のことを示唆している:ここに述べたように

1)インデックスの断片化を確認し、手順に従ってください - https://docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes

2)JOINS使用している間、あなたにもテーブルの順序を考慮する必要があります。テーブルのレコード数が少ない場合は、最初に使用します。したがって、次の後続の結合ではフィルタリングするレコードの数が少なくなります。

3)テーブルに(この場合はId以外の)テーブルがある場合は、適切なインデックスを使用します。

これが役に立ちます。

よろしく、 ジョニーズ

0

あなたが直接他のテーブルi.id年代に表1の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 ; 
関連する問題