2012-11-25 3 views
1

내 WinForms 앱에서 SQLite DB로 이진 파일의 많은 양의 데이터를로드하고 있습니다. DB에 대한 조회를 수행하여 각각의 새로운 데이터 조각을 추가할지 여부를 결정합니다.SQLite 로딩 속도를 높이기 위해 캐시로 데이터 셋 클래스를 사용해야합니까?

If LookUpResult Then 
    AddNewData 
Else 
    DiscardNewData 
End If 

이것은 느립니다. INSERT는 오랜 시간이 걸리는 것 같습니다. DataTable 또는 DataSet 클래스를 사용하여 데이터를 RAM에로드 한 다음 SQLite DB에 백그라운드 작업으로 써야합니까? 또는 DataTable 개체에서 한 번에 많은 행을 삽입하는 것이 비용이 적게 듭니까?

이전에 모든 데이터를 사용자 지정 클래스에로드하고 있었지만 빠른 속도 였지만 메모리 제한이 발생할 가능성이 있으므로 DB로 이동했습니다. 나는 SQLite가 RAM에 INSERT를 캐시 할 것이라고 생각했을 지 모르지만 그럴 것 같지 않습니다.

어떤 조언을 주셔서 감사합니다.

+0

거래를 사용하고 있습니까? –

+0

아니요, 지금까지는 들어 본 적이 없었으므로 여러 개의 INSERT를 수행 한 다음 모두를 한 번에 실행하면 속도가 빨라질 것 같습니다. 나는 새로운 데이터가 추가되어야 하는지를 결정하기 위해 이미 추가 된 데이터를 검색 할 필요가 있기 때문에 이것이 나를 위해 작동한다고 생각하지 않는다. 아마도 커밋되지 않은 INSERT는 SELECT 쿼리에 의해 반환되지 않습니다. – Guy

답변

1

충돌 일관성을 보장하기 위해 변경된 데이터는 모든 트랜잭션이 끝날 때 디스크와 동기화됩니다. 명시 적 트랜잭션을 사용하지 않으면 각 명령마다 고유 한 자동 트랜잭션이 발생하므로 각 명령에 대한 동기화 오버 헤드가 발생합니다.

모든 삽입에 대해 하나의 트랜잭션을 사용하십시오. 은 동일한 DB 연결을 사용하는 한이 표시됩니다.

+0

아, 커밋되지 않은 INSERT가 SELECT에 표시됩니까? 그게 내가 필요로하는 것처럼 들리며 작동하도록 캐시하는 논리적 인 방법처럼 보입니다. 나는 유일한 사용자/연결이므로 문제가되어서는 안됩니다. 나는 곧 그것을 시도하고 돌아올 것이다. 감사. – Guy

+0

훌륭하게 작동합니다! 두 줄의 코드 (BeginTransaction 및 Commit)를 추가하고 시간을 크게 줄였습니다. 감사! – Guy

관련 문제