2014-04-20 4 views
0

android 응용 프로그램에서 sqlite 문제가 있습니다. JOIN OPERATION이 제 성능을 완전히 상실하는 것 같습니다.SQLite는 내부 조인을 좋아하지 않습니다?

하나의 테이블은 내 응용 프로그램이 사전이고 lookups와 같은 fts3 benefits 사전을 읽었 기 때문에 하나의 테이블은 fts3 테이블입니다.

CREATE VIRTUAL TABLE tango USING fts3 (okurigana, kana, pos, pos_detail); 
CREATE TABLE translation (_id int(7), language VARCHAR(10), meaning VARCHAR(100), FOREIGN KEY (_id) REFERENCES tango(rowid)); 
CREATE INDEX lang_match ON translation (language); 

내가이 명령이 테이블을 조회 :

Select a.rowid, a.okurigana, a.kana, b.meaning 
from tango a inner join translation b 
    ON a.rowid=b._id AND b.language='eng' 
WHERE a.okurigana MATCH 'A*'" 

쿼리합니다 이 제 2 개 테이블은 내가 주로 다른 언어로 단어 (오쿠 리가 나)의 의미를 점점 (참가 할 수 있습니다 몇 초 내가 이유를 이해 해달라고. 완료합니다. 나는이 쿼리를 사용하는 경우 (내부를 제거 가입) 쿼리가 매우 빠릅니다.

Select a.rowid, a.okurigana, a.kana 
from tango a 
WHERE a.okurigana MATCH 'A*'; 

을하는 이유는 죽이고 가입 않습니다 성능 o.0?

답변

2

인덱스를 사용하여 쿼리 속도를 높일 수 있습니다. 이 쿼리는 다음과 같습니다.

Select a.rowid, a.okurigana, a.kana, b.meaning 
from tango a inner join 
    translation b 
    ON a.rowid = b._id AND b.language = 'eng' 
WHERE a.okurigana MATCH 'A*'" ; 

기본적으로 두 가지 방법으로 엔진에서이 쿼리를 처리합니다. 한 가지 방법은 where 절을 사용하여 tango에서 필터링을 수행 한 다음 translation의 값을 조회하는 것입니다. 이를 위해 유용한 인덱스는 다음과 같습니다

create index translation_id_language_meaning on translation(_id, language, meaning) 

다른 방법은 translation를 스캔 한 후 탱고에 조회를 수행하는 것입니다.

create index translation_language_id_meaning on translation(language, _id, meaning) 

첫 번째는 아마 당신의 쿼리에 가장 적합한,하지만 더 나은 솔루션은 테이블 통계 값의 분포에 따라 달라이를 위해 유용한 지표가 될 것이다.

1

내부 조인을 추가하면 돌아 오는 행 수가 크게 늘어나지 않고 쿼리 속도가 느려지므로 대개 스키마에 인덱스가 없기 때문입니다.

귀하의 경우 translation._id 또는 translation.language이 색인 생성되지 않은 것 같습니다 (두 열 모두 색인 생성 필요).

이 두 열에 CREATE INDEX ... command을 사용하여 인덱스를 추가하면 쿼리 속도가 빨라집니다.

관련 문제