여러 CSV 파일에서 가져온 데이터로드를 관리하기 위해 응용 프로그램에서 TClientDataSet을 사용하고 있습니다. 이것은 전체적으로 백만 이상의 항목 일 수 있습니다. 특정 CSV 파일과 관련된 모든 데이터 세트 항목을 삭제할 수 있기를 원하지만 많은 수의 항목을 삭제하는 데 시간이 많이 걸립니다.Delphi ClientDataSet - 삭제 작업 - 왜 그렇게 느린가요?
내가 바보 같은 짓을하고 있다면 테스트 해보고 간단한 콘솔 응용 프로그램을 만들었습니다. 그것은 이라곤이다
CDS := TClientDataSet.Create(nil); CDS.FieldDefs.Add('ID', ftInteger); CDS.CreateDataSet; CDS.LogChanges := False;
추가] 100,000 항목 (얻어 0.1 초) :
for i := 1 to 100000 do begin CDS.AppendRecord([i]); end;
정의 1 개 필드와 TClientDataSet의 인스턴스 (ID)를 만들기
50,000 개 항목 삭제 (~ 4 초 또는
LogChanges=TRUE
~ 4.4 초 소요) :
CDS.First; while CDS['ID'] <= 50000 do CDS.Delete;
지금 해결 방법으로 새 데이터 세트를 만든 다음 보관하려는 모든 항목을 새 복사본으로 복사하고 원본 복사본을 삭제해야합니다. 원래 데이터 집합의 항목 중 일부만 제거하는 것이 아니라면이 방법이 훨씬 빠릅니다.
아마 데이터 집합에서 항목을 제거하는 데 가장 적절한 방법을 사용하지 않겠습니까? 내가 삭제 한 모든 항목에 대해 일련의 내부 처리가 트리거되고 있다고 생각합니다. 한번에 누락 된 항목을 삭제하는 방법이 있습니까? 아마도 인덱스를 기반으로 인덱스와 범위를 설정 한 다음 한 번의 작업으로 현재 범위의 모든 항목을 삭제할 수 있습니까?
아마 ClientDataSet이 문제일까요? 아마도 다른 구성 요소를 사용해야 할 것입니다. 어떤 제안?
아마도 ['LogChanges'] (http://docwiki.embarcadero.com/Libraries/Berlin/en/Datasnap.DBClient.TCustomClientDataSet.LogChanges)를 끄는 것을 잊었을 것입니다. –
델타를 유지하는 것이 저렴하지 않기 때문에 흥미로운 점이 있습니다. –
집계 및 색인을 언급 했으므로 이러한 문제가 원인 일 수 있습니다. 벌크 삭제 작업 전에 비활성화하고 다시 필요할 때 다시 활성화하십시오. (문제는 매번 삭제가 끝날 때마다 완전히 불필요한 업데이트가 발생하는 것일 수 있습니다.) –