Firebird 1.5와 Zeos라이브러리를 써서 다음과 같이 코딩해서 데이타 넣는 것을 테스트 해보았습니다.
<!--CodeS-->
...
ZQuery1.CachedUpdates := true;
ZQuery1.RequestLive := true;
dtStartTime := now;
for i := 1 to 10000 do begin
ZQuery1.SQL.Text := 'insert into aaa (f1, f2, f3, f4, f5, f6) values(:bb, :bb, :bb, :bb, :bb, :bb)';
ZQuery1.ParamByName('bb').Value := round(random(100))+100;
ZQuery1.ExecSQL;
end;
ZQuery1.ApplyUpdates;
dtEndTime := now;
dtLapTime := dtEndTime - dtStartTime;
...
<!--CodeE-->
그런데 이렇게 데이타를 넣는 경우와 비교하기 위해
ZTable1.CachedUpdates := false;
ZTable1.RequestLive := true;
인 상태에서
ZTable.Append와 ZTable.Post를 사용하여 같은 량의 데이타를 넣었을 때 오히려 위의 전자의 경우가 오히려 시간이 더 걸리는데요, 진정 어떻게 대량의 데이타를 넣는 것이 가장 빠른 방법인 지 의문입니다.
분명 대부분 말씀하시길 CachedUpdates를 true로 해놓고 ApplyUpdates를 사용해서 데이타를 밀어 넣는게 빠르다고 하는데 for loop을 돌기 시작할 때부터 ApplyUpdates가 끝날때까지의 시간을 측정해보면 전자의 경우가 후자보다 눈에 띄게 시간이 더 걸리는 것을 확인할 수 있었는데요, 왜 그런것인지요?
그래서, 제가 해본 방법 중에 그나마 가장 빠른 방법으로 현재는 ZTable.Append를 사용해서 데이타를 추가하고 있는데..좀더 빠르게 입력할 수 있는 방법이 있으면 한수 부탁드리겠습니다.
그러므로 Table이나 RequestLive를 사용한 Query 또는 UpdateObject를 연결한 Query컴포넌트에 직접 데이타를 추가하거나 변경할때 사용합니다.
수정이나 변경이 끝나고 나면 일괄적으로 서버에 반영을 하는 것이죠
c.StartTransaction;
try
query1.ApplyUpdates;
query2.ApplyUpdates;
...
c.Commit;
except
c.RollBack;
end;