SQLite 대량 insert 시 속도 저하 개선
SQLite 에서 대량으로 insert 시에 속도가 너무 느려서 방법을 찾던차
인터넷에서 찾은 방법입니다.
SQLite 사이트에 설명이 있다던데, 매뉴얼을 덜보다보니... ^^
var
QueryStr: string;
EndTime, StartTime, i: integer;
begin
// 여기가 추가됨.
SQLQuery1.SQL.Text := 'PRAGMA synchronous=0';
SQLQuery1.ExecSQL;
// 여기까지.
StartTime := GetTickCount;
for i := 1 to 1000 do begin
QueryStr := 'INSERT INTO log (date, time, matchrate)';
QueryStr := QueryStr + 'VALUES ("2018-10-20", "14:30:20", "' + IntToStr(i) + '");';
try
SQLQuery1.SQL.Text := QueryStr;
SQLQuery1.Prepared := true;
SQLQuery1.ExecSQL();
except
on E: Exception do begin
Memo1.Lines.Add('Exception raised with message: ' + E.Message);
end;
end;
end;
EndTime := GetTickCount;
Memo1.Lines.Add('걸린 시간: ' + IntToStr(EndTime - StartTime));
// 여기가 추가됨.
SQLQuery1.SQL.Text := 'PRAGMA synchronous=2';
SQLQuery1.ExecSQL;
// 여기까지.
end;
=======================================================
대용량 인서트시 쿼리를 이렇게 날리시면 아니되옵니다~~.
1000개의 쿼리를 하나씩 따로 날리지 마시고
걍~ 리스트에 쭈욱 담아서 ExecSQL 한 번만 호출하면 됩니다.
각 쿼리 문장의 끝에 ; 문자만 붙이면 됩니다.
for i := 1 to 1000 do begin
QueryStr := 'INSERT INTO log (date, time, matchrate)';
QueryStr := QueryStr + 'VALUES ("2018-10-20", "14:30:20", "' + IntToStr(i) + '");';
SQLQuery1.SQL.Add(QueryStr);
end;
SQLQuery1.Prepared := true;
SQLQuery1.ExecSQL();
========================================================
본문에 sqlite를 사용하신다고 언급을 하셨군요.
sqlite에서는 시작시 'BEGIN TRANSACTION' 완료 후
'COMMIT TRANSACTION'을 사용해야 한다고 합니다.
sqlite에는 bulk insert는 sql구문으로는 없는것 같네요.
'Delphi Tip > 데이터베이스' 카테고리의 다른 글
델파이 데이타베이스 기초 2 (0) | 2023.10.04 |
---|---|
델파이 데이타베이스 기초 1 (0) | 2023.09.27 |
델파이 FDConnection SQLConnection 소스코드로 MySQL DB연결 (0) | 2022.01.13 |
오라클에 이미지 저장/불러오기 방법 (0) | 2022.01.11 |
MSSQL 초 --> 시분초 변환 (0) | 2022.01.07 |
댓글