본문 바로가기
Delphi Tip/데이터베이스

SQLite 대량 insert 시 속도 저하 개선

by MonoSoft 2022. 1. 12.
728x90
반응형

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구문으로는 없는것 같네요. 

 

728x90
반응형

댓글