2016-07-18 12 views
0

に参加しましょう私は、クエリのこの種に出くわした:クロスインナーよりもはるかに高速が仕事で

select distinct psv.pack_id from pack_store_variant psv, pack p 
where p.id = psv.pack_id and p.store_id = 1 and psv.store_variant_id = 196; 

は、私が検索のビットを行なったし、これは基本的に2つのデカルト積をしていselect from table1, table2に新しいビーイングテーブル。私はこれが不必要にNxM行を作成していると思っていました。通常の結合を使用するだけで動作するはずです。だから私はこのクエリを書きました:私は比較をしたとき

SELECT DISTINCT pack_id from (SELECT pack_id, store_id, store_variant_id 
FROM pack JOIN pack_store_variant ON pack.id = pack_store_variant.pack_id) as comb 
where comb.store_id = 1 AND comb.store_variant_id = 196; 

は驚くべきことに、最初のものは速く私より一桁でした。どういうふうに私の質問が吸い込まれますか?または、クロスジョイン/インナージョイントの違いを正しく理解していないのですか?

答えて

1

あなたの質問はあまり良くありません。クエリを2つの選択肢に分割します。内側のテーブルはテーブルを作成し、次にそれを再度選択します。これはあまり効率的ではありません。これが私のやり方です。

select distinct psv.pack_id from pack_store_variant as psv 
Join pack as p on p.id = psv.pack_id 
where p.store_id = 1 and psv.store_variant_id = 196; 
+0

クエリでは、どこで1つのループで結合が行われますか? – hoodakaushal

+0

@hoodakaushalはい。パフォーマンスはクロス結合より優れているはずですが、これは100%ではありません。 –

+0

それはそうではないことが分かります。クエリーは私の方法よりも速いですが、クロス結合よりも一貫して高速ではありません - どちらも数ms以内ですが、どちらも常に高速です。私はそれをただのままにすることに決めました。 – hoodakaushal

関連する問題