MagicHome=# EXPLAIN SELECT
MagicHome-# c.no, c.gid, c.name, c.total, c.auth, b.eid, b.name as object_name, p.pid, p.name as page_name
MagicHome-# from
MagicHome-# view_board_category c left join
MagicHome-# working.view_boardbox b on c.no=b.default_board and b.gid=c.gid left join
MagicHome-# working.view_page p on b.eid=any(p.eids) and b.gid=p.gid and c.gid=p.gid
MagicHome-# where
MagicHome-# c.gid=174;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Nested Loop Left Join (cost=2859.42..2950.82 rows=11 width=74)
Join Filter: ("outer".eid = ANY ("inner".eids))
-> Merge Left Join (cost=2859.42..2885.81 rows=11 width=57)
Merge Cond: ("outer".gid = "inner".gid)
Join Filter: ("outer"."no" = "inner".opti[1])
-> Index Scan using index_tb_board_category_gid on tb_board_category (cost=0.00..16.29 rows=11 width=25)
Index Cond: (gid = 174)
-> Sort (cost=2859.42..2864.34 rows=1967 width=74)
Sort Key: m.gid
-> Hash Join (cost=49.36..2751.81 rows=1967 width=74)
Hash Cond: ("outer".mid = "inner".mid)
-> Seq Scan on tb_object o (cost=0.00..2668.03 rows=1967 width=74)
Filter: ("type" = 3::smallint)
-> Hash (cost=42.89..42.89 rows=2589 width=8)
-> Seq Scan on tb_member m (cost=0.00..42.89 rows=2589 width=8)
-> Index Scan using index_tb_page_gid_pageid on tb_page (cost=0.00..5.87 rows=1 width=138)
Index Cond: (("outer".gid = tb_page.gid) AND ("outer".gid = tb_page.gid))
(17건 있음)
작업시간: 4.764 ms
MagicHome=# EXPLAIN SELECT
MagicHome-# c.no, c.gid, c.name, c.total, c.auth, b.eid, b.name as object_name, p.pid, p.name as page_name
MagicHome-# from
MagicHome-# (select * from view_board_category where gid=174) c left join
MagicHome-# (select * from working.view_boardbox where gid=174) b on c.no=b.default_board and b.gid=c.gid left join
MagicHome-# (select * from working.view_page where gid=174) p on b.eid=any(p.eids) and b.gid=p.gid and c.gid=p.gid
MagicHome-# where c.gid=174;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Nested Loop Left Join (cost=0.00..466.27 rows=1 width=74)
Join Filter: ("outer".eid = ANY ("inner".eids))
-> Nested Loop Left Join (cost=0.00..460.36 rows=1 width=57)
Join Filter: (("outer"."no" = "inner".opti[1]) AND ("inner".gid = "outer".gid))
-> Index Scan using index_tb_board_category_gid on tb_board_category (cost=0.00..4.03 rows=1 width=25)
Index Cond: ((gid = 174) AND (gid = 174))
-> Nested Loop (cost=0.00..456.30 rows=2 width=74)
-> Index Scan using index_tb_member_gid_uid on tb_member m (cost=0.00..9.11 rows=2 width=8)
Index Cond: (gid = 174)
-> Index Scan using index_tb_object_mid on tb_object o (cost=0.00..223.52 rows=6 width=74)
Index Cond: ("outer".mid = o.mid)
Filter: ("type" = 3::smallint)
-> Index Scan using index_tb_page_gid_pageid on tb_page (cost=0.00..5.87 rows=1 width=138)
Index Cond: (("outer".gid = tb_page.gid) AND ("outer".gid = tb_page.gid))
Filter: (gid = 174)
(15건 있음)
작업시간: 5.589 ms
MagicHome=# EXPLAIN SELECT
MagicHome-# c.no, c.gid, c.name, c.total, c.auth, b.eid, b.name as object_name, p.pid, p.name as page_name
MagicHome-# from
MagicHome-# (select * from view_board_category where gid=174) c left join
MagicHome-# (select * from working.view_boardbox where gid=174) b on c.no=b.default_board and b.gid=c.gid left join
MagicHome-# (select * from working.view_page where gid=174) p on b.eid=any(p.eids) and b.gid=p.gid and c.gid=p.gid;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Merge Left Join (cost=456.30..535.50 rows=11 width=74)
Merge Cond: ("outer".gid = "inner".gid)
Join Filter: ("outer".eid = ANY ("inner".eids))
-> Merge Left Join (cost=456.30..472.66 rows=11 width=57)
Merge Cond: ("outer".gid = "inner".gid)
Join Filter: ("outer"."no" = "inner".opti[1])
-> Index Scan using index_tb_board_category_gid on tb_board_category (cost=0.00..16.29 rows=11 width=25)
Index Cond: (gid = 174)
-> Materialize (cost=456.30..456.32 rows=2 width=74)
-> Nested Loop (cost=0.00..456.30 rows=2 width=74)
-> Index Scan using index_tb_member_gid_uid on tb_member m (cost=0.00..9.11 rows=2 width=8)
Index Cond: (gid = 174)
-> Index Scan using index_tb_object_mid on tb_object o (cost=0.00..223.52 rows=6 width=74)
Index Cond: ("outer".mid = o.mid)
Filter: ("type" = 3::smallint)
-> Index Scan using index_tb_page_gid_pageid on tb_page (cost=0.00..62.74 rows=16 width=138)
Index Cond: (gid = 174)
(17건 있음)
작업시간: 5.596 ms
VACUUM ANALYZE를 한 상태입니다 -.-;
세 쿼리의 결과는 동일합니다..
view_board_category: 1개의 테이블(5509건)
working.view_boardbox: 2개의 테이블(tb_member(2589건),
tb_object(24482건))이 조인 후 검색(438건)
working.view_page: 1개의 테이블(6273건)
어떤 쿼리를 사용하는 것이 가장 좋을까요? 쿼리플랜과 인덱스
사용은 두번째 쿼리가 완벽(?)한것 같은데 수행결과나 쿼리 모양은
첫번째가 가장 좋은것 같습니다..
|