설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


총 게시물 187건, 최근 0 건
   

대용량 테이블 조회결과 빨리 추출하는 방법 문의

글쓴이 : 모델광 날짜 : 2020-11-01 (일) 10:15 조회 : 5959
오라클은 큰 테이블을 where 절 없이 조회하면 순식간에 화면에 나오는데....
오라클은 일정 수(default 15 row?)가 차면 client로 결과 값을 던져 줍니다.

postgresql에서 매우 큰 테이블을
select * from big_table;
조회하니 결과가 10초 이상 기다려야 화면에 나오네요.
(테스트 tool : OmniDB, PgAdmin)

PostgreSQL에서 Limit 절 사용하지 않고, 대용량 테이블 조회시 빨리 화면에 나오게 하는 방법 있나요?

PostgresDBA 2020-11-03 (화) 09:17
오라클과 달리 pg 는 부분페치를 안합니다.
조건절없이 select 하면 모든로우를 다 페치합니다.
select * from xxx limit 10; 이렇게 조회하는 방법뿐.

pg가 나쁜게 아니고 오라클과 다른것뿐입니다.
댓글주소
모델광 2020-11-05 (목) 03:03
그렇군요. OLTP시스템에서 데이터 일부만이라도 화면에 빨리 뿌려주고 싶은 경우가 많은데... 아쉽네요.
댓글주소
     
     
PostgresDBA 2020-11-05 (목) 11:53
프로그래밍은 별개의 문제입니다.

limit 주지 않고 구현하라면,
커서 열어서 원하는 로우수만큼만 페치하고 close 하면되죠.
전혀문제될게 없습니다.

그런데 원하는 정확한 의도를 잘 모르겠네요.
댓글주소
모델광 2020-11-07 (토) 22:04
원래 저의 의도는 Oracle의 부분범위 처리(?) 기능을 PostgreSQL에서도 사용할려고 하는 것입니다.
(아직 PostgreSQL에서는 방법을 찾지 못했습니다.)
오라클을 사용하는 application에서 일단 화면에 빨리 조회결과 나와서 사용자에게는 속도가 빠른것처럼 느끼게 해주는 트릭을 많이 사용합니다.
즉 Hash Join으로 수행되어야 빨리 수행되는 쿼리도 일부로 Nested Loop Join으로 수행되게 해서 쿼리 결과의 일부분이라도 일단 클라이언트로 보내서 사용자에게는 빨리 수행되는 것처럼 보이게 하는 것입니다.
예를 들어 아래 쿼리를 보시면, orders_detail 테이블과의 조인을 스칼라서브쿼리로 처리했기 때문에 전체 결과에 대한 응답속도는 오래 걸리나, 클라이언트 화면에서 보면 15건은 일단 화면에 뜨기 때문에 사용자는 응답 속도가 매우 빠른것처럼 느낄 수 있습니다.
예를 들어 아래 쿼리 소요시간은 10 sec 인데, 클라이언트 화먼에는 0.1 sec만에 15건이 뜹니다.
(PostgreSQL은 무조건 10sec가 지나야 화면에 뜹니다.ㅠㅠ)
SELECT A.CUST_ID, A.COMMENT
  FROM (
                SELECT CUST_ID, COMMENT
                          , (SELECT SUM(B.ORD_AMT)
                                FROM ORDERS_DETAIL B
                            WHERE A.ORD_NO = B.ORD_NO
                                  AND B.ORD_AMT > 790)
                                                                          AS S_AMT
                  FROM ORDERS A
              WHERE ORD_DATE LIKE '20190%‘
              ) A
;
댓글주소
   

postgresdba.com