2012-11-08 2 views
0

나는 4 개의 테이블을 만들고 나중에 선택할 수 있습니다. 선택은 첫 번째 3 select 문에 대해 완벽하게 작동하지만 네 번째 항목은 iPhone 시뮬레이터에서 약 10 초, sqlite3 콘솔에서 약 5 초 걸립니다. 또한 iPhone 시뮬레이터에서는 0 개의 결과를 얻지 만 콘솔에서는 1을 얻습니다. 하지만 성능 문제를 해결 한 후 해결해야 할 문제입니다.select 문이 극도로 느림

인덱스에 대해 읽고 성능을 향상시키는 방법을 읽었지 만 코드에서 구현하는 방법을 알지 못합니다.

sql0 = [[NSString alloc]initWithFormat:@" 
create table v%i 
as select id_produkt 
from v%i natural join produkt_eigenschaft 
where id_eigenschaft = 
(select id_eigenschaft from eigenschaft where at = '%@')",counter,counter-1,selectedStringItem]; 

, 그 후 :

NSString *sqleig = [[NSString alloc]initWithFormat:@" 
select at 
from eigenschaft 
where id_eigenschaft IN 
(select distinct id_eigenschaft 
from produkt_eigenschaft 
where id_produkt IN (select * from v%i)) 
AND rubrik = '%i'",counter-1, [sender tag] + 1]; 

왜 문이 천천히 실행? 어떻게 해결할 수 있습니까? 미리 감사드립니다.

편집 : 인덱스를 해결 쿼리 계획 및 .schema

explain query plan create table v3 as select id_produkt from v2 natural join produkt_eigenschaft where id_eigenschaft = (select id_eigenschaft from eigenschaft where at = '101-170'); 
0|0|1|SCAN TABLE produkt_eigenschaft (~100000 rows) 
0|0|0|EXECUTE SCALAR SUBQUERY 1 
1|0|0|SEARCH TABLE eigenschaft USING AUTOMATIC COVERING INDEX (at=?) (~7 rows) 
0|1|0|SEARCH TABLE v2 USING AUTOMATIC COVERING INDEX (id_produkt=?) (~7 rows) 

explain query plan select at from eigenschaft where id_eigenschaft IN (select distinct id_eigenschaft from produkt_eigenschaft where id_produkt IN (select * from v3)) AND rubrik = '5'; 
0|0|0|SCAN TABLE eigenschaft (~10000 rows) 
0|0|0|EXECUTE LIST SUBQUERY 1 
1|0|0|SCAN TABLE produkt_eigenschaft (~100000 rows) 
1|0|0|EXECUTE LIST SUBQUERY 2 
2|0|0|SCAN TABLE v3 (~1000000 rows) 
1|0|0|USE TEMP B-TREE FOR DISTINCT 



CREATE TABLE eigenschaft (id_eigenschaft integer,rubrik integer,en text,at text,ba text,bg text,hr text,cz text,hu text,pl text,ro text,ru text,rs text,sk text,si text); 
CREATE TABLE farbe (id_farbe integer,hexcode text,farbton integer,farbname text); 
CREATE TABLE produkt (id_produkt integer,code text,pdf_link text,image_link text,image_small blob,link text,en text,at text,ba text,bg text,hr text,cz text,hu text,pl text,ro text,ru text,rs text,sk text,si text,active integer); 
CREATE TABLE produkt_eigenschaft (id_produkt integer,id_eigenschaft integer); 
CREATE TABLE produkt_farbe (id_produkt integer,id_farbe integer); 
CREATE TABLE produkt_surface (id_surface integer,id_produkt integer,image_link text); 
CREATE TABLE produkt_text (id_produkt integer,en text,at text,ba text,bg text,hr text,cz text,hu text,pl text,ro text,ru text,rs text,sk text,si text); 
CREATE TABLE rubrik (id integer,en text,at text,ba text,bg text,hr text,cz text,hu text,pl text,ro text,ru text,rs text,sk text,si text); 
CREATE TABLE v0(id_produkt INT); 
CREATE TABLE v1(id_produkt INT); 
CREATE TABLE v2(id_produkt INT); 
CREATE TABLE v3(id_produkt INT); 
+0

콘솔에서 ['EXPLAIN QUERY PLAN'] (http://www.sqlite.org/lang_explain.html) 이러한 쿼리를 실행의 출력을 표시하고, 당신의 스키마 ('.schema' 명령을 사용하십시오). –

+0

메인 포스트에 추가했습니다. – oybcs

+0

내 v3 테이블에 1 백만 행이 얼마나 있는지 모르겠습니다. o_O – oybcs

답변

0

을 설명합니다.

create index i on produkt_eigenschaft (id_eigenschaft) 

전화 한번 선택하기 전에

관련 문제