database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7212 게시물 읽기
No. 7212
ORDER BY 수행시간에 대한 질문입니다.
작성자
조성찬
작성일
2007-09-06 15:57ⓒ
2007-09-06 16:09ⓜ
조회수
5,360

안녕하세요.


아래와 같은 쿼리로 데이터를 검색했을때 ORDER BY를 했을 경우 시간이 굉장히 오래 걸립니다.


SELECT write_time FROM tblSearchData1, to_tsquery( '가방' ) AS q WHERE ( ( title_vector @@ q ) OR ( content_vector @@ q ) ) ORDER BY write_time DESC LIMIT 10 OFFSET 0


to_tsquery()에 들어가는 단어에 따라 실행시간이 조금씩 틀리지만 대략 7~8초 정도 걸리는것 같습니다.


테이블의 데이터는 약800만건 이고 SELECT의 결과는 평균 4~5천건 정도입니다. 


이 상태에서 ORDER BY 하지 않고 값을 가져오면 약 5~600ms 정도 걸립니다. 



pg버전은 8.2.4이고 시스템 사양은 쿼드코어6600에 4기가 램 입니다.


현재 postgres의 시스템 설정은 

shared_buffers = 2000MB

work_mem = 32MB

maintenance_work_mem = 64MB

와 같이 해놓았습니다. 


ORDER BY 시에 속도를 향상 시킬 방법이 있으면 조언 부탁드립니다.


그럼 수고하세요.

이 글에 대한 댓글이 총 4건 있습니다.

explain analyze 를 쿼리 앞에 붙이셔서 쿼리 플랜을 보여주시면 답을 얻으시는데 도움이 됩니다.

댓글로 쿼리 플랜을 올려주세요

신기배(소타)님이 2007-09-06 23:55에 작성한 댓글입니다.

짐작 컨데, order by 에서 비용을 다 잡아먹나보네요.

일다은 환경설정으로 work memory 량을 늘려주면 첫번째 쿼리는 늦더라도 두번째 쿼리는 좀 빠를 수도 있습니다. ^^

share 메모리는 그만큼 크게 잡아줄 필요가 없습니다. 

동시 커넥션 되는 클라이언트 갯수만 감안해서 할당해 주면 됩니다.

제가 보기에는 다른 방법을 쓴다고 하더라도, 현재 쿼리로는 답이 나오지 않을 것 같습니다.
 tsearch 의 인덱스와 write_time 칼럼의 인덱스를 어떻게 하면 같이 쓸 수 있을까 ?

이 고민을 하셔야할 것 같습니다. 

write_time 이 insert 될때만 그 값이 지정되고 어떠한 경우에도 변경 되지 않을 것이며, 
그 해당 자료가 잦은 delete 를 하지 않는다면, write_time 칼럼 값으로 인덱스를 만들고,

tsearch 인덱스와 write_time 인덱스 두개를 같이 쓸 방법을 찾아야 원하는 결과를 얻을 수 있을 것 같습니다. 

김상기(ioseph)님이 2007-09-07 01:10에 작성한 댓글입니다.

우선 답글 감사드립니다. ^^

위와 같은 쿼리 실행시의 쿼리플랜은 아래와 같습니다.

"Limit  (cost=7222.50..7222.53 rows=10 width=8) (actual time=11233.460..11233.467 rows=10 loops=1)"
"  ->  Sort  (cost=7222.50..7227.50 rows=1998 width=8) (actual time=11233.458..11233.461 rows=10 loops=1)"
"        Sort Key: tblsearchdata7.write_time"
"        ->  Nested Loop  (cost=149.27..7112.97 rows=1998 width=8) (actual time=419.622..11207.968 rows=21351 loops=1)"
"              ->  Function Scan on q  (cost=0.00..0.01 rows=1 width=32) (actual time=0.005..0.006 rows=1 loops=1)"
"              ->  Bitmap Heap Scan on tblsearchdata7  (cost=149.27..7082.97 rows=1999 width=185) (actual time=419.610..11191.394 rows=21351 loops=1)"
"                    Recheck Cond: ((tblsearchdata7.title_vector @@ q.q) OR (tblsearchdata7.content_vector @@ q.q))"
"                    ->  BitmapOr  (cost=149.27..149.27 rows=1999 width=0) (actual time=393.200..393.200 rows=0 loops=1)"
"                          ->  Bitmap Index Scan on idxtitlevector7  (cost=0.00..44.09 rows=999 width=0) (actual time=145.901..145.901 rows=9957 loops=1)"
"                                Index Cond: (tblsearchdata7.title_vector @@ q.q)"
"                          ->  Bitmap Index Scan on idxcontentvector7  (cost=0.00..104.69 rows=999 width=0) (actual time=247.298..247.298 rows=14764 loops=1)"
"                                Index Cond: (tblsearchdata7.content_vector @@ q.q)"
"Total runtime: 11234.951 ms"

김상기님이 언급하신 것처럼 해당 테이블에 데이터가 입력된 후 수정은 전혀 일어나지 않습니다. 다만 새

로운 데이터가 계속 추가될 뿐입니다. 처음에는 날짜를 내림차순 인덱스로 잡고 클러스터링 해서 사용하

려고 했었는데 PG는 내림차순 인덱스를 지원하지 않더라구요. 그래서 사용하는 임시 방편이 일일 업데이

트가 있을 때 새로운 데이터를 입력하고 날짜 내림차순으로 테이블을 새로 생성합니다. 이렇게 정렬을 해

서 사용하는게 시간도 오래 걸리고 너무 번거로운 작업들이 많아 ORDER BY로 다시 해결해 보려고 했지

만 잘 되지가 않네요. ^^

조성찬님이 2007-09-10 10:45에 작성한 댓글입니다. Edit

실제로 가장 오래걸리는 부분은 21351 개의 row를 sort하는 부분이네요..

단순히 드릴수 있는 답변은 work_mem을 많이~ 늘려 보심이 ^^;;

신기배(소타)님이 2007-09-11 16:58에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7215PostgreSQL Weekly News
신기배
2007-09-10
5901
7214Postpres connct 오류 [1]
주지훈
2007-09-09
4928
7213pg_dump -o 질문. [1]
김태수
2007-09-07
4917
7212ORDER BY 수행시간에 대한 질문입니다. [4]
조성찬
2007-09-06
5360
7210실수로 테이블 내용 삭제시 복구방법은? [2]
정희아빠
2007-09-04
5721
7208Postgresql 8.1.4 와 phpPgAdmin-4.1.3 연결이 안됩니다. [2]
이덕영
2007-08-30
5830
7207alter 사용시.. [2]
눈팅지존
2007-08-28
5150
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다