2017-05-04 8 views
1

私は2つのテーブル:A, Bを持っています。2つのテーブルから効果的にデータを選択するには?

Aは、prisoner_idおよびの列を有する。

B囚人に関するその他の情報はすべてprisoner_name列です。

WITH prisoner_datas AS 
(SELECT prisoner_name, ... FROM B WHERE ...) 

は、その後、私は私のprisoner_datasidのすべてを知りたい:

まず私がBから必要なデータをすべて選択します。それは両方のテーブル

のために一般的ですので、これを行うために、私は、 prisoner_name列で情報を結合する必要が私でした次

SELECT A.prisoner_id, prisoner_datas.prisoner_name, prisoner_datas. ..., 
FROM A, prisoner_datas 
WHERE A.prisoner_name = prisoner_datas.prisoner_name 

しかし、それは非常に遅い動作します。パフォーマンスを向上させるにはどうすればよいですか?

+2

'WITH prisoner_datas AS' ...これはMySQL構文ではありません。どのデータベースを実際に使用していますか? –

+1

ヒント: 'INNER JOIN'。 –

+0

@TimBiegeleisen postgressql –

答えて

1

Bテーブルのprisoner_name結合列にインデックスを追加します。次に、次の結合でパフォーマンスが向上するはずです。

SELECT 
    A.prisoner_id, 
    B.prisoner_name, 
    B.prisoner_datas.id  -- and other columns if needed 
FROM A 
INNER JOIN B 
    ON A.prisoner_name = B.prisoner_name 

ここでは明示的な結合構文を使用しています。必須ではなく、クエリプランは変更されないかもしれませんが、クエリを読みやすくします。私はCTEが大きく変わるとは思っていませんが、ここでは結合列の索引がないことが重要です。

+0

'FROM A、prisoner_datas'はPostgreSQLの暗黙のクロスジョインではありませんか? –

+2

@VojtěchDohnalいいえ、あなたが綿密に見れば、そのクロス結合は 'WHERE'節で制限されているからです。これは古いスタイルの結合です。 –

+0

テーブル 'A'が非常に大きく、 'prisoner_datas'が' A'よりはるかに小さい場合、変更は必要ですか? –

関連する問題