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 5774 게시물 읽기
No. 5774
offset 값이 커질수록 점점 느려지는 문제가 생기네요...T.T
작성자
이실
작성일
2004-12-30 17:27
조회수
2,969

Fedora Core3 에 PostgreSQL beta5를 사용중입니다.

데이터가 약 6백만건정도 있는 테이블에서 select 시 인덱스를 타게 조건을 주고

limit xxx offset yyy 를 주고 쿼리를 던졌습니다.

그런데 offset값이 적을 경우는 금방 결과를 가져오는데 offset 값이 커질수록 점점 느려지더니

나중에는 테이블을 seq scan한 경우보다 결과를 느리게 가져오더군요..

쩝. 이게 무슨 문제인지 아니면 제가 뭔가를 잘못알고있는건지 ...

 

테이블은 시간별 발생하는 로그를 쌓는 테이블이라 update, delete는 거의 발생하지않고

대부분 insert와 select만 있습니다.

테이블 정보는 다음과 같습니다.

 

test=> \d test_tab
Column | Type |

col1 | character varying(20) |
col2 | character varying(20) |
col3 | character varying(20) |
col4 | character varying(20) |
col5 | character varying(20) |
col6 | timestamp without time zone |
col7 | character varying(256) |
col8 | timestamp without time zone |
col9 | numeric |
col10 | numeric |
col11 | numeric |
col12 | timestamp without time zone |
col13 | timestamp without time zone |
col14 | character varying(128) |
col15 | character varying(10) |
col16 | character varying(20) |
col17 | character varying(20) |
Indexes:
"test_idx" btree (col8, col4)

 

우선 인덱스를 타게 조건을 주고 offset 값을 적게 준 경우입니다.

test => explain ANALYZE select * from test_tab where col8 >= '2003-12-01 00:00:00'::timestamp and col8 <= '2003-12-31 23:59:59'::timestamp limit 25 offset 0;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..99.88 rows=25 width=538) (actual time=107.588..108.672 rows=25 loops=1)
-> Index Scan using test_idx on test_tab (cost=0.00..113558.62 rows=28423 width=538) (actual time=107.576..108.520 rows=25 loops=1)
Index Cond: ((col8>= '2003-12-01 00:00:00'::timestamp without time zone) AND (col8<= '2003-12-31 23:59:59'::timestamp without time zone))
Total runtime: 108.884 ms
(4 rows)

Time: 110.783 ms

다음은 인덱스를 타게 조건을 주고 offset 값을 크게 준 경우입니다.

lgsec=> explain ANALYZE select * from test_tab where col8 >= '2003-12-01 00:00:00'::timestamp and col8 <= '2003-12-31 23:59:59'::timestamp limit 25 offset 1000000;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=113558.62..113558.62 rows=1 width=538) (actual time=108988.257..109004.914 rows=25 loops=1)
-> Index Scan using test_idx on test_tab (cost=0.00..113558.62 rows=28423 width=538) (actual time=0.054..106409.983 rows=1000025 loops=1)
Index Cond: ((col8>= '2003-12-01 00:00:00'::timestamp without time zone) AND (col8 <= '2003-12-31 23:59:59'::timestamp without time zone))
Total runtime: 109005.121 ms
(4 rows)

Time: 109007.054 ms

 

다음은 인덱스를 안타게하고 offset 값을 크게 준 경우입니다.

test=> explain ANALYZE select * from test_tab where col8::text >= '2003-12-01 00:00:00' and col8::text <= '2003-12-31 23:59:59' limit 25 offset 1000000;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Limit (cost=269863.62..269863.62 rows=1 width=538) (actual time=44063.355..44063.974 rows=25 loops=1)
-> Seq Scan on test_Tab (cost=0.00..269863.62 rows=28423 width=538) (actual time=22.532..41591.367 rows=1000025 loops=1)
Filter: (((col8)::text >= '2003-12-01 00:00:00'::text) AND ((col8)::text <= '2003-12-31 23:59:59'::text))
Total runtime: 44064.164 ms
(4 rows)

Time: 44065.987 ms

결과를 보시면 offset이 큰경우 index scan 보다 seq scan이 cost는 크지만 결과는 훨씬 빨리 나오네요..
휴~~ 데이터베이스는 정말 오묘하네요. OTZ

 

그럼 감사합니다.

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

죄송. offset으로 검색해보니 이전에 올라왔던 내용이네요..

^^ 그럼 모두 새해 복 많이 받으세요..

이실님이 2004-12-30 17:37에 작성한 댓글입니다. Edit

이 부분에 대한 문제를 작년 여름에 꽤 심도 깊게(?) 이야기를 했던 부분입니다.

그 이야기의 핵심 개념이 이곳 DSN 게시판에 적용 되면서 DSN이 개편되었거든요.

 

지금 시스템이라면, 제 예상으로는 기능적인 측면이 확장 되지 않는다면, 지금의 10배 이상 자료에도 지금의 속도와 별로 차이 없이 운영될 수 있지 않을까싶습니다.

 

자세한 이야기는

http://database.sarang.net/?inc=read&aid=4823&criteria=pgsql

 

http://database.sarang.net/sources.php

 

페이지를 참조 하세요.

 

 

 

김상기(ioseph)님이 2004-12-31 01:04에 작성한 댓글입니다.

으핫! 저 얘기 했던게 벌써 1년 4개월이 지난 건가요? 흐미.... 그동안 별로 한 것도 없는 것 같은데... -.-;;;

박성철(gyumee)님이 2004-12-31 08:20에 작성한 댓글입니다.

답변 정말 감사드립니다.

이미 limit - off -으로 제작이되어있는 부분을

이제와서 바꿀려니 이거참.. 이제 프로젝트 마감인데.. 쩝..

바꾸기는 바꿔야겠네요..

 

그리고 너무 심도 깊은 얘기들이라.ㅎㅎ

말씀해주신 게시판의 얘기를 읽어봐도 핵심을 잘 모르겠네요..

소스를 들여다봐도 쩝.. 실력이 없서서 눈에 잘 안들어오네요..

 

임시테이블을 만들고 id값을 구해 해당 id 값으로 기존 테이블을

쿼리하라는 거 같기도 하고 쩝. OTZ

 

죄송하지만 핵심되는 얘기를 간단히 설명 해주실수는 없나요? ^^

 

 

 

이실님이 2004-12-31 14:53에 작성한 댓글입니다.
이 댓글은 2004-12-31 15:08에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
5777디비에 자동으로 인덱싱을 하려고 하는데 [1]
왕태봉
2005-01-03
2153
5776wireless LAN linux device driver 소스를 구하려면 어떻게 해야 하나요? [2]
허인
2005-01-03
1977
5775copy 명령 사용중에 에러가 발생하는데요.. [4]
왕초보
2004-12-30
2660
5774offset 값이 커질수록 점점 느려지는 문제가 생기네요...T.T [4]
이실
2004-12-30
2969
5773count(*) 와 pg_num_rows [1]
장현성
2004-12-30
3219
5772모레 RC3가 뜰것 같네요.. [1]
신기배
2004-12-30
2165
5771rc2 와 rc2-ja 의 버전 차이 [1]
오준석
2004-12-30
2503
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다