2010-02-22 1 views
7

내가 지점 번호의 사전 정의 된 설정을 일치 약 9000 항목 만 추출 기록의 데이터 집합을 스캔해야델파이 ADO 쿼리

while (not ADOQuery1.Eof) do 
    begin 
     /* Do something */ 
     ADOQuery1.Next; 
    end; 

보다는 ADO 데이터 집합을 반복 할 수있는 빠른 방법이있다. 실행하기 전에

답변

7

이 같은 작업의 ADORecordSet를 사용하는 것이 훨씬 빠릅니다 :

while not ADOQuery1.Recordset.EOF do 
    begin 
    ADOQuery1.Recordset.MoveNext; 
    // get value 
    SomeVar := ADOQuery1.Recordset.Fields['FieldName'].Value; 
    end; 
+1

그게 사실입니까? 나는 .next .eof와 .fields 호출이 어쨌든 레코드 세트 객체로 갈 것이라고 생각했습니다. – MarkF

+0

데이터 세트가 반복을 늦추는 많은 다른 작업을 수행하기 때문에 레코드 세트를 직접 제어하는 ​​것이 훨씬 빠릅니다. – Linas

+0

이것은 약간의 속도 향상을 제공하지만, 처음에는 많은 레코드를 반복하지 않아도되는 것은 아닙니다. –

8

@Pieter, 두 가지 옵션

1)은 지점 번호의 사전 정의 된 세트 WHERE 조건 느릅 나무 일치를 추가, 당신의 SQL 문장을 수정할 수 있습니다.

2) TAdoQuery의 Filter 속성을 사용합니다.

AdoQuery1.close; 
AdoQuery1.filter := 'your condition goes here'; 
AdoQuery1.filtered := true; 
AdoQuery1.Open; 
+4

그는 맞습니다. 가장 빠른 방법은 SQL에서 WHERE 절을 사용하여 필요한 레코드 만 반환하도록하는 것입니다. SQL은이를 위해 특별히 최적화되어 있으며 클라이언트 측에서 수행 할 수있는 작업보다 더 나은 작업을 수행 할 수 있습니다. –

+0

이 답변은 DB 수준에서 데이터를 필터링 할 수 있다고 가정합니다. 필자는 필터링이 응용 프로그램 메서드에 대한 호출을 포함하고 단순히 where 절을 사용하여 수행 할 수없는 많은 상황을 겪었습니다. –

10

것은이 데이터 집합에 관련된 볼 컨트롤을 업데이트하는 시간을 낭비하지에 대한 모든 necesary 아니라면 당신이 DisableControls/EnableControls를 사용하십시오.

try 
    ADOQuery1.DisableControls; 
    while (not ADOQuery1.Eof) do 
    begin 
     /* Do something */ 
     ADOQuery1.Next; 
    end; 
finally 
    ADOQuery1.EnableControls; 
end; 

감사합니다.

+3

이 문제가 발생하는 이유는 http://edn.embarcadero.com/article/27790을 참조하십시오. –

+0

Gerry에게 감사드립니다. –

0

가능한 한 늦게까지 (다른 모든 항목이 일치 할 때까지) 문자열 비교를 피함으로써 추가적인 성능 향상을 얻을 수 있습니다. 데이터베이스에 많은 수의 중복 문자열이있는 경우 정수를 사용하여 첫 번째 테이블로 다시 링크 된 별도의 테이블에 문자열을 배치하는 것을 고려하십시오.

-1

당신은 SQL을 포함하는 쿼리를 변경할 수 있습니다 where 절, 나는 또한 매우,에 앞으로 만보고 제안 읽기 전용 커서를 최대 속도 증가를 제공하는 것이다

Select whatever fields From whatevertable 
where branchnumber in (
    select branchnumber from whatevertable where branchid=xxz 
) 

같은.

0

델파이 ADO 항목 (TADOQuery 또는 TADOTable)은 나쁘지 않습니다 (Delphi XE2/2007에서 확인). Transbase 테이블 (ODBC 드라이버)에서 SQL 파일과 Navicat를 통해 MySQL로 데이터를 내보내는 중이었습니다. 거의 백만 건의 레코드가있는 테이블의 경우 ADO (8 백만 레코드 테이블은 2 일 후 10 % 완료), TQuery을 사용하여 몇 분 (BDE 버그로 인해 큰 테이블이 손상 될 수 있음, BDE는 마지막 15 개 업데이트되지 않음 년) 순수한 ODBC 또는 Navicat를 통해 몇 분. 조언 : ADO 대신 (개발자가 심각하게 수정하기 전까지) ADO를 사용하십시오.