2016-05-05 13 views
1

スキルと呼ばれるテーブルが2つあります:developer_idとlanguage_idです。 language_idのセットを持つすべての開発者を取得したい(開発者はすべてを返す必要があります)。値を含む列のすべての行を選択する

SELECT developer_id FROM skills WHERE language_id = 256 
INTERSECT 
SELECT developer_id FROM skills WHERE language_id = 85 

HashSetOp Intersect (cost=24192.94..422840.17 rows=114424 width=4) 
    -> Append (cost=24192.94..413497.17 rows=3737200 width=4) 
     -> Subquery Scan on "*SELECT* 1" (cost=24192.94..183000.11 rows=1292452 width=4) 
       -> Bitmap Heap Scan on skills (cost=24192.94..170075.59 rows=1292452 width=4) 
        Recheck Cond: (language_id = 256) 
        -> Bitmap Index Scan on skill_dev_lang_idx (cost=0.00..23869.83 rows=1292452 width=0) 
          Index Cond: (language_id = 256) 
     -> Subquery Scan on "*SELECT* 2" (cost=45763.23..230497.06 rows=2444748 width=4) 
       -> Bitmap Heap Scan on skills skills_1 (cost=45763.23..206049.58 rows=2444748 width=4) 
        Recheck Cond: (language_id = 85) 
        -> Bitmap Index Scan on skill_dev_lang_idx (cost=0.00..45152.05 rows=2444748 width=0) 
          Index Cond: (language_id = 85) 

SELECT developer_id FROM skills 
WHERE language_id IN (256,85) 
group by developer_id 
having count(*) = 2 

HashAggregate (cost=262124.17..266259.96 rows=330863 width=4) 
    Group Key: developer_id 
    Filter: (count(*) = 2) 
    -> Bitmap Heap Scan on skills (cost=66996.18..243438.17 rows=3737200 width=4) 
     Recheck Cond: (language_id = ANY ('{256,85}'::integer[])) 
     -> Bitmap Index Scan on skill_dev_lang_idx (cost=0.00..66061.88 rows=3737200 width=0) 
       Index Cond: (language_id = ANY ('{256,85}'::integer[])) 

が、これらの両方が遅い(3-4秒)です:

は、私は2つのアプローチを試してみました。

私はdev_idとlanguage_idの両方にインデックスを持っています。 〜3000万行あります。

+0

単一の一意インデックス(language_id、dev_id)を持っていますか?この特定の順序で –

+0

@ラシャンええ正確なインデックス –

+0

実行計画を投稿することはできますか? –

答えて

0

あなたのクエリは、おそらく次のようにパフォーマンスが向上しますグループをカウントし、(あなたの合計30M +からインデックス・スキャンによってフィルタリング)ALL 3Mレコードをカウントして、COUNT(*)= 2によってフィルタリングされています

SELECT s.developer_id 
FROM skills s 
JOIN skills s2 ON (s2.developer_id = s.developer_id) 
WHERE s.language_id = 256 AND s2.language_id = 85 
関連する問題