2009-07-25 2 views
2

안녕하세요, 여기 아래쪽이 있습니다.iPhone Sqlite 성능 문제

기본 키 (col1), 텍스트 (col2) 및 텍스트 (col3)로 구성된 표가 하나 있습니다. 기본적으로지도. 이 테이블에는 약 200,000 개의 행이 들어 있습니다. 기본적으로 단일 행을 검색하는 데 약 1.x 초가 걸립니다 (이것이 내가 원하는 전부입니다). 기본적으로 col2 = 'some value'테이블에서 select *를 사용하고 있습니다.

각 열을 개별적으로, col2와 col3 모두에 대한 색인을 만들려고했으나 실제로는 전혀 개선되지 않았습니다.

궁금합니다. 정상입니까? 난 큰 테이블에 대한 느린 sqlite 성능에 대해 불만을 가진 사람들의 게시물을 보지 못했습니다. 그래서 내가 잘못하고있는 것이 궁금합니다.

도움을 주시면 감사하겠습니다.

+0

정말 결과가 한 행입니까? – Juergen

+1

또한 쿼리를 실행할 때 응용 프로그램에 대해 Instruments 또는 Shark를 실행하는 것이 좋습니다. 비슷한 문제가 있었는데 SQLite라고 가정했으나 속도가 느려졌을 때 내 코드에서 부적절한 문자열 파싱 메서드로 밝혀졌습니다. –

+0

예 단 하나의 행만 반환된다는 것을 확신합니다. 상어에게 시도해 보겠습니다. 그 아이디어에 감사드립니다! –

답변

2

나는 proble을 해결했다. 엠. 새 sqlite 데이터베이스 파일을 만들어 프로젝트에 추가했을 때 xcode가 제대로 다시 컴파일되지 않았고 여전히 이전 파일을 사용하고있었습니다. 프로젝트에서 이전 데이터베이스를 제거하고 컴퓨터에서 컴파일 된 버전을 제거한 다음 프로젝트를 정리하고 컴파일 한 다음 데이터베이스가 누락되어 충돌이 발생했는지 확인해야했습니다. 그런 다음 컴파일 된 파일을 제거하고 정리 한 다음 새 sqlite 데이터베이스를 다시 추가하십시오. 이유는 어떠한 성능 향상이 없었다 인덱스 ....

이상한,이는 엑스 코드 버그로 간주 될 것입니다 내가 만든 후에도

이 무엇입니까?

+0

사용자 정보 오류 ;) – Sneakyness

2

나는 이것이 일반적으로 일반적이지 않다라고 말할 것이다.

대형 테이블을 사용하는 경우에도 색인을 통한 액세스는 비교적 빠릅니다.

당신이 할 수있는 일 : col2에 하나의 색인 만 작성하십시오 (이것은이 선택에 필요한 색인입니다).

"EXPLAIN SELECT ...."를 사용하여 정보를 얻는 것보다 SQLite가 만드는 것보다. 결과는 읽기 쉽지 않지만, 일부 경험을 통해 색인이 사용되는지 확인할 수 있습니다. 여기에 결과를 게시 할 수도 있습니다.

나는이 클래스 (SQLAdapter라고 함) 싱글했습니다, 이것은 그것을 여기에서 두 가지 방법, 그 필요한 경우 하나의 데이터베이스를 복사하고, 다른 하나는 내 SQL 코드 간부 인을 포함
+0

이것은 테이블에서 Explain select *의 출력입니다. col1 = 'something' 0 | 고토 | 0 | 23 | 1 | 정수 | 0 | 0 | 2 | OpenRead | 0 | 2 | 3 | SetNumColumns | 0 | 3 | 4 정수 | 0 | 0 | 5 | OpenRead | 1 | 4 | keyinfo (1, BINARY) 6 | String8 | 0 | 0 | one 7 | IsNull | -1 | 20 | 8 | MakeRecord | 1 | 0 | a 9 | MemStore | 0 | 0 | 10 | MoveGe | 1 | 20 | 11 | MemLoad | 0 | 0 | 12 | IdxGE | 1 | 20 | + 13 | IdxRowid | 1 | 0 | 14 | MoveGe | 0 | 0 | 15 | 열 | 0 | 0 | 16 열 | 0 | 1 | 17 | 열 | 0 | 2 | 18 콜백 | 3 | 0 | 19 | 다음 | 1 | 11 | 20 | 닫기 | 0 | 0 | 21 | 닫기 | 1 | 0 | 22 정지 | 0 | 0 | 23 거래 | 0 | 0 | 24 | VerifyCookie | 0 | 3 | 25 | 고토 | 0 | 1 | 26 | Noop | 0 | 0 | –

+0

아아, 형식이 멋지게 여기에 http://dpaste.com/71454/ –

+0

안녕하세요 Paul, 4 개의 유도 공백이있는 원래 게시 (물론 답변)에 붙여 넣는 방법에 대해). 따라서 만료되지 않습니다. – Juergen

1

: 다음은

을 SQL 코드 방법이 우리가 말하는, 그래서 그냥 문자열이 ...

- (NSString *)getMapping:(NSString *)test{ 
    //Our return string 
    NSString *res = test; 

    // Setup the database object 
    sqlite3 *database; 

    NSString *sqlStmnt; 
    if (direction) sqlStmnt = @"select * from table where col1 = '"; 
    else sqlStmnt = @"select * from table where col2 = '"; 

    NSString *tStmt = [sqlStmnt stringByAppendingString:test]; 
    NSString *sqlState = [tStmt stringByAppendingString:@"'"]; 
    const char * sqlStatement = [sqlState UTF8String]; 

    // Open the database from the users filessytem 
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
     // Setup the SQL Statement and compile it for faster access 
     sqlite3_stmt *compiledStatement; 
     //execute the statement 
     if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) != SQLITE_OK) { 
      NSAssert1(0, @"Error: during prepare '%s'.", sqlite3_errmsg(database)); 
     } 
     //bind our translation into the sql select statment 
     sqlite3_bind_text(compiledStatement, 1 , [word UTF8String], -1, SQLITE_TRANSIENT); 
     if(sqlite3_step(compiledStatement) == SQLITE_ROW) { //if execution is successful i.e. we get a match 
      //lets return the desired language translation 
      res = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, (direction) ? 2 : 1)]; 
     } 
     sqlite3_finalize(compiledStatement); //Release the compiled statement from memory 
    } 
    sqlite3_close(database); //lets return the translation 
    return res; 
} 

거의 정확히 같은 방식으로, 나는이 변화하고있어 방법을 추가 무시, 내가의 Obj-C로 코딩이 처음이 내가 실수하지 않는다면 SQLiteBook 프로젝트는 그것을 수행한다 ...

+0

어쩌구 저쩌구, 그 서식이 엉망이 여기에 멋지게 서식이 : http://dpaste.com/71397/ –

+0

그래서 나는 데이터베이스를 열 때마다 데이터베이스를 열 때마다 코드를 옮겼다. 프로그램이 처음 로딩 될 때, 나는 단지 쿼리를 실행한다. 병목 현상은 sqlte3_step (stmt)과 관련이있는 것으로 보입니다. 이것은 모든 것 중에서 가장 오래 걸리는 것입니다. –