제가 어떤 테이블하나를 놓고 그 테이블과 관련된 테이블 5개를 left join 시켰습니다.
한 쿼리에 6개의 테이블이 사용된건데요.
쿼리를 여러번 할까 한번의 쿼리로 할까 하다가 한번에 하는것이 코딩에도 좋고 그래서 한번에 하도록 했는데요.
left join 6번
컬럼(!)=컬럼 10여번
order 를 3개의 컬럼을 ASC로 정렬
이렇게 복잡하게 쿼리를 explain으로 돌려보니 참 희한한 결과가 나오더군요 =_=;
asp=# explain SELECT (가져올컬럼들)
asp=# from tb_templet t left join tb_tem_html th on t.no=th.no
asp=# left join tb_tem_section_data tsd on tsd.no=t.no
asp=# left join tb_cont_n c on c.no=tsd.cont_no and c.able > '0'
asp=# left join tb_tem_vote tv on tv.no=t.no and tv.able='1'
asp=# left join tb_tem_vote_data tvd on tvd.relate=t.no and tvd.types='Q'
asp=# where t.id='ID' and t.s='index' and t.able='1'
asp=# order by t.seq, t.type, t.no;
NOTICE: QUERY PLAN:
Sort (cost=404.80..404.80 rows=333 width=120)
-> Merge Join (cost=350.83..390.83 rows=333 width=120)
-> Merge Join (cost=281.00..301.00 rows=333 width=92)
-> Sort (cost=211.18..211.18 rows=333 width=84)
-> Merge Join (cost=180.71..197.21 rows=333 width=84)
-> Sort (cost=110.88..110.88 rows=100 width=66)
-> Merge Join (cost=35.93..107.56 rows=100 width=66)
-> Index Scan using tb_tem_section_data_pkey on tb_tem_section_data tsd (cost=0.00..59.00 rows=1000 width=8)
-> Sort (cost=35.93..35.93 rows=10 width=58)
-> Nested Loop (cost=0.00..35.76 rows=10 width=58)
-> Seq Scan on tb_templet t (cost=0.00..27.50 rows=1 width=42)
-> Index Scan using tb_tem_html_pkey on tb_tem_html th (cost=0.00..8.14 rows=10 width=16)
-> Sort (cost=69.83..69.83 rows=1000 width=18)
-> Seq Scan on tb_cont_n c (cost=0.00..20.00 rows=1000 width=18)
-> Sort (cost=69.83..69.83 rows=1000 width=8)
-> Seq Scan on tb_tem_vote tv (cost=0.00..20.00 rows=1000 width=8)
-> Sort (cost=69.83..69.83 rows=1000 width=28)
-> Seq Scan on tb_tem_vote_data tvd (cost=0.00..20.00 rows=1000 width=28)
EXPLAIN
다른 쿼리들은 간단간단한데 유독 이 쿼리만 복잡해야하거나 나눠서 해야만 하는 쿼리입니다.
그리고 나눠서 한다면 코딩이 일반적으로 쿼리를 나누는것보다 훨씬 복잡해져야 하고요 =_=;
제가 explain 내용을 길게 뿌렸는데요.
저정도 수치가 나온다는건 좋은건가요 않좋은 건가요?
저 쿼리말고 다른 쿼리는
Limit (cost=30.01..30.01 rows=1 width=70)
-> Sort (cost=30.01..30.01 rows=1 width=70)
-> Seq Scan on tb_cont_n (cost=0.00..30.00 rows=1 width=70)
이정도 나옵니다.
데이터는 거의 없는 상태이고요.
집에 있는 테스트 서버서 돌려본건데 셀400에 ZX보드, 128메가램 입니다.
사양이 않좋다지만 페이지당 평균 10~20회정도 쿼리를 해야는데 페이지 로딩이 PHP계산 포함 1초가 약간 안걸립니다.
postgres를 이곳에 있는 문서를 보고 공유메모리를 늘려줬는데도 이정도가 되니 실제로 펜3 급의 서버에서 돌릴때는 얼마나 속도가 나올런지 의문이네요 -.-;;;
너무 느리면 서비스 자체가 불가능하지 않을까 합니다 =_=;
젤 위의 쿼리를 나누는것이 좋을까요. 아니면 저대로 쓰되 쿼리를 좀 간결하게 하는것이 좋을까요?
답변 부탁드립니다~ :)
|