2014-02-19 5 views
0

이 코드는 실행하는 데 시간이 오래 걸립니다. 약 10 만 개의 레코드가 있습니다. 각 단계는 대략 동일한 시간이 걸립니다 .... FMResultSet의 결과를 가져 와서 3 개의 배열로 읽습니다. 두 개의 select 문을 사용하여 시도했습니다. 하나는 결과 카운트를 얻은 다음 그 양을 mutableArray에 할당하는 것입니다. 성능 차이는 없습니다. 속도 향상을위한 제안?FMDB - FMResultSet 속도 향상

FMResultSet *results = [database executeQuery:@"SELECT FriendlyName, Serial, Barcode FROM Inventory, Company WHERE Inventory.friendlyName <> '' AND Company.CompanyID = Inventory.companyID AND Company.CompanyName = ?", selectedCompany]; 

arrayFriendlyName =[[NSMutableArray alloc]init]; 
arraySerial = [[NSMutableArray alloc]init]; 
arrayBarcode = [[NSMutableArray alloc]init]; 


while([results next]) { 

    [arrayFriendlyName addObject:[results stringForColumn:@"FriendlyName"]]; 
    [arrayBarcode addObject:[results stringForColumn:@"Barcode"]]; 
    [arraySerial addObject:[results stringForColumn:@"Serial"]]; 

} 

[database close]; 
+1

시간이 얼마나 걸립니까 사용자에게 좋지 않습니까? 나는 100000 개의 기록이 그 과정을 늦추 리라고 믿는다. 그 일을 배경으로 보낼 수 있습니까? – Volker

+0

다중 선택은 물론 아무것도 사지 않을 것입니다. UI 스레드를 끊으 려하지 않는다면 최적의 방법으로 @Volker가 말한대로 백그라운드 대기열에 작업을 수행 할 수 있습니다. –

+0

그런데 한 번에 1000,000 개의 레코드가 필요한 이유는 무엇입니까? 필요하다면 레코드를 게으르지 않고 앱에 심각한 성능 위협을 일으키는 이유는 무엇입니까? –

답변

0

데이터베이스 구조에 따라 sqlite를 둘러싼 객체 지향적 인 래퍼는 수천 개의 행에서 상당히 느릴 수 있습니다. 에 의해 객체 지향 래퍼를 사용하지 않고 sqlite 데이터베이스에 직접 액세스하여 속도를 높일 수 있습니다. 어떤 관계도 (최소한 예제 코드에서는) 필요 없기 때문에 관련 기능을 잃지 않고 얻을 수있는 한 빨리 될 것입니다.

언제나처럼, 레이 Wenderlich 살펴볼 수있는 좋은 자료입니다 : 당신이 이미 그것을하지 않았다 경우 http://www.raywenderlich.com/913/sqlite-tutorial-for-ios-making-our-app

, 당신은 또한 당신의 인덱스가 쿼리를 마우스 오른쪽 버튼으로 설정되어 있는지 여부를 살펴 수 있습니다 -로 조인 된 열에 인덱스가 없으면 성능에 심각한 영향을 미칠 수 있습니다.