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万行あります。
単一の一意インデックス(language_id、dev_id)を持っていますか?この特定の順序で –
@ラシャンええ正確なインデックス –
実行計画を投稿することはできますか? –