마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

레코드가 많은 경우 SQLite 3 select 성능 관련..

0 추천
안녕하세요.

요즘 제가 하는 것중에 SQLite3에서  데이타를 많이 들어가는 경우가 있는데요.

테이블의 레코드가  4만6000개 이상 넣어두고 사용하는데요.

select  _id, path from image where _id > ???? limit 50;

이런식으로 사용하거든요.

 

그런데,  테이블의 앞부분에서는  괜찮은데,

2만 5000개 이상 넘어가면  select  만 하는데요 4~5초가 걸려 버리네요 ㅡ.ㅡ

앞부분에서는 몇 ms 이내...

_id는  프라이머리Key 라서  인텍스가 자동으로 걸리는 것으로 알고 있는데,

 

위 이리 느린지 알수가 없네요.

 

임베이디드 DB의 한계려나...

 

혹시 관련된 글 아시면 링크좀 부탁드립니다.

감사합니다.
볼레로 (120 포인트) 님이 2013년 2월 26일 질문
sqlite의 한계이거나 단말 성능의 한계 아닐까요?
저도 예전에 suggest 기능 하려고 미리 테이블에 5만개 정도의
레코드를 저장하고 테스트 해봤는데
select 속도 때문에 뚝뚝 끊기더라구요.
결국 레코드를 2만개 정도로 줄여서 사용했네요.

2개의 답변

0 추천
select를 했을때 결과는 테이블 형태로 나오게 되겠죠?

( 정해진 column 들로 이루어진 row의 집합)

 

이 테이블 크기가 일정수준을 넘어가면 갑자기 속도가 확내려갑니다.

전 예전에 주소록 로딩하는데 그렇게 되었던 적이 있습니다.

 

여기서 크게 두가지 대응법이 나옵니다.

column을 줄이거나 row 크기를 줄이거나...

(근본적인 방법은 row를 줄이는 것이겠죠.)

 

제가 알기로 한번 select 할때 가져오는 크기가 1MB 정도로 알고 있습니다. (왜 1MB인지는 저도 잘 모르겠네요.)

이것에 걸려서 select가 느려지는것으로 추정됩니다.
그냥가자 (140 포인트) 님이 2013년 2월 26일 답변
column 이나 row 수를 줄일 수는 없는 상황이구요 ^^
테이블을 나누면 조금 줄일 수는 있는데,  이건 또 다른 문제가 있고 시간도없고..

http://docs.blackberry.com/en/developers/deliverables/24549/BP_Optimizing_SQLite_database_performance_1219781_11.jsp

첫번째 조언이 데이타를 줄이라는 거네요 ^^
0 추천
아 다들 비슷한 문제가 있으시군요.

 

해결책이라기 보다는 몇가지 찾은 정보 더 추가 합니다.

 

Select 에서  혹시라도 offset을 사용하는 있다면,  record가 많은 경우는 피하라고 하네요.

예들들어  

select  * from table limit 10 offset 3000   

이런 경우라면 , 내부적으로 3010개의 결과를 구한후에 10개만 리턴하기 때문에  offset 값이 큰 경우는 성능이 많이 떨어진다고 합니다.

 

우선  select의 결과값을  줄려서 우선을 임시로 해결했습니다.

 

예들 들어,  테이블의 앞부분에서는

select * from table where _id < 10000 limit 400;

뒷부분 에서는

 

select * from table where _id > 30000 limit 5;

 

이렇게 해도 select 시간 자체가 오래 걸리는 것은 어쩔수가 없더군요.
익명사용자 님이 2013년 2월 26일 답변
...