How to filter SQL results in a has-many-through relation

后端 未结 13 1462
有刺的猬
有刺的猬 2020-11-21 05:17

Assuming I have the tables student, club, and student_club:

student {
    id
    name
}
club {
    id
    name
}
stude         


        
13条回答
  •  北荒
    北荒 (楼主)
    2020-11-21 05:53

    -- EXPLAIN ANALYZE
    WITH two AS (
        SELECT c0.student_id
        FROM tmp.student_club c0
        , tmp.student_club c1
        WHERE c0.student_id = c1.student_id
        AND c0.club_id = 30
        AND c1.club_id = 50
        )
    SELECT st.* FROM tmp.student st
    JOIN two ON (two.student_id=st.id)
        ;
    

    The query plan:

     Hash Join  (cost=1904.76..1919.09 rows=337 width=15) (actual time=6.937..8.771 rows=324 loops=1)
       Hash Cond: (two.student_id = st.id)
       CTE two
         ->  Hash Join  (cost=849.97..1645.76 rows=337 width=4) (actual time=4.932..6.488 rows=324 loops=1)
               Hash Cond: (c1.student_id = c0.student_id)
               ->  Bitmap Heap Scan on student_club c1  (cost=32.76..796.94 rows=1614 width=4) (actual time=0.667..1.835 rows=1646 loops=1)
                     Recheck Cond: (club_id = 50)
                     ->  Bitmap Index Scan on sc_club_id_idx  (cost=0.00..32.36 rows=1614 width=0) (actual time=0.473..0.473 rows=1646 loops=1)                     
                           Index Cond: (club_id = 50)
               ->  Hash  (cost=797.00..797.00 rows=1617 width=4) (actual time=4.203..4.203 rows=1620 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 57kB
                     ->  Bitmap Heap Scan on student_club c0  (cost=32.79..797.00 rows=1617 width=4) (actual time=0.663..3.596 rows=1620 loops=1)                   
                           Recheck Cond: (club_id = 30)
                           ->  Bitmap Index Scan on sc_club_id_idx  (cost=0.00..32.38 rows=1617 width=0) (actual time=0.469..0.469 rows=1620 loops=1)
                                 Index Cond: (club_id = 30)
       ->  CTE Scan on two  (cost=0.00..6.74 rows=337 width=4) (actual time=4.935..6.591 rows=324 loops=1)
       ->  Hash  (cost=159.00..159.00 rows=8000 width=15) (actual time=1.979..1.979 rows=8000 loops=1)
             Buckets: 1024  Batches: 1  Memory Usage: 374kB
             ->  Seq Scan on student st  (cost=0.00..159.00 rows=8000 width=15) (actual time=0.093..0.759 rows=8000 loops=1)
     Total runtime: 8.989 ms
    (20 rows)
    

    So it still seems to want the seq scan on student.

提交回复
热议问题