Kori 3월 13일, 2022에 포스트됨 공유하기 3월 13일, 2022에 포스트됨 Docwiki에 있는 "Performance of the Array DML Command (FireDAC)"를 번역한 글 (번역일: 2022년 3월 14일) 위로 가기: [DocWiki 번역] 명령(command)을 가지고 작업하기 (FireDAC) 이 글은 FireDAC에서 지원하는 Array DML 기능의 높은 수행 성능에 대해 설명한다. 이 첫번째 글은 코드 몇줄 만으로 레코드 수천개를 1초만에 삽입(Insert) 하는 간단한 예제를 살펴본다. 목차 머릿말 (Introduction) 테스트 환경 준비 방법 (How to Prepare your Test Environment) FireDAC Array DML 명령의 주요 요소 (Main elements of the Array DML commands) 사용 팁 (Usage Hints) Array DML 테스트를 실행한 전형적인 결과 (Typical Results of the Array DML Test Run) 성능 팁 (Performance Hints) 기타 자료 (See Also) 머릿말 (Introduction) FireDAC은 각 데이터베이스 서버 별 고유한 Array DML 명령(Command) 구현을 모두 캡슐화하여 개발자가 동일한 코드로 사용할 수 있도록 했다. 데이터베이스 서버 별 구현이 기반이므로, 실제 성능은 그에 따라 달라진다. 주로 Oracle, Microsoft SQL Server, IBM DB2는 Array DML을 매우 강력하게 지원하므로 성능 증가가 눈에 띈다. 개발자는 자신의 애플리케이션과 네트워크 안에서 예제 코드를 사용하여, 어느 정도까지 성능 향상을 기대할 수 있는 지를 미리 느껴볼 것을 권장한다. 테스트 환경 준비 방법 (How to Prepare your Test Environment) 아래 예제는 FireDAC 데모 데이터베이스 환경에서 작동한다. 이 데이터베이스 설치에 관한 보다 자세한 내용은 FireDAC Demo Databases를 보라. RAD 스튜디오를 설치했다면 Sample 디렉토리 안에서 데모 프로젝트들을 찾을 수 있다. 이 튜토리얼에서 사용하는 코드: (공용 문서> Embarcadero > Studio > [버전] > [언어] > Database 폴더 아래) FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\ArrayDML 기본 코드 예제: (위와 같은 상위 경로 아래) FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Batch FireDAC Array DML 명령의 주요 요소 (Main elements of the Array DML commands) 이 "사용 사례(Use Case)"를 떠올려 보자. 당신은 INSERT, UPDATE, DELETE, 또는 기타 파라미터가 있는 명령(command)을 N 번 수행해야 한다. 전형적인 경우 명령 1개에서 레코드 1개를 전달된다. 그렇다면 전달할 레코드 1개 (즉 파라미터 1 세트) 마다 클라이언트(애플리케이션)와 서버(DBMS)간에 SQL 명령 실행 요청이 따로 전송되므로 네트워크, 클라이언트, 서버 모두 부하가 크게 걸린다. Array DML은 레코드(데이터 세트)를 1개 뿐만 아니라 아니라 N 개를 모아서 한번에 전송한다. 아래 예제를 보자. FDQuery1.SQL.Text:= 'insert into ADQA_Batch_test (tint, tstring) values(:f1, :f2)'; Array DML 명령을 사용하면 당신의 코드 속도가 현격히 빨라진다. Array DML 명령은 파라미터 1 세트 뿐만 아니라 아니라 N 세트를 전송한다. FDQuery1.Params.ArraySize := 100; ... for i := 0 to FDQuery1.Params.ArraySize -1 do begin FDQuery1.Params[0].AsIntegers[i] := i; FDQuery1.Params[1].AsStrings[i] := 'Test' + IntToStr(i); end; FDQuery1.Execute(FDQuery1.Params.ArraySize); 위 TFDQuery의 Params 프로퍼티에는 1차원 배열이 아니라 2차원 배열이 들어간다. 따라서 서버에 보내기 전에 미리 파라미터 값 세트 N개를 저장할 수 있다. 보다 자세한 설명은 Array DML 부분을 살펴보라. 사용 팁 (Usage Hints) Array DML은 파라미터를 가질 수 있는 명령 (INSERT, UPDATE, DELETE ...)이라면 거의 모든 경우에 사용할 수 있다. 에러 핸들링은 레코드 수준을 지원한다. 별도 아티클에서 설명한다. FireDAC은 Array DML을 일원화한다. (데이터베이스 서버 별로 서로 다른 해당 API를 하나하나 보지 않아도 된다) Array DML 테스트를 실행한 전형적인 결과 (Typical Results of the Array DML Test Run) 첨부된 테스트 코드를 사용하여 당신의 환경 안에서 실험을 해볼 수 있다. 그림. 예제 코드에서 Array DML 성능을 테스트 할 수 있다. 자신의 환경에 맞춘 후 테스트 해보자. 이 테스트 예제의 결과는 호스트와 네트워크 성능에 따라 크게 달라진다. 꽤 오래된 노트북 컴퓨터에 Oracle을 설치하고 로컬로 연결하는 경우, 위 그림과 같이 1초에 레코드 100,000개가 처리된다. Array DML은 ArraySize가 클 수록 성능 향상이 더 크다 (여기서는 2000개까지 올렸다) 성능 팁 (Performance Hints) Array DML 명령 수행 성능에 영향을 주는 것들은 다음과 같다. 네트워크가 느릴 수록 상대적으로 속도 차이가 눈에 띈다. TCP/IP 패킷을 더 적게 만들기 때문이다. 클라이언트의 CPU 부하가 줄어든다. 전체 수행 시간 중 대부분은 배열을 받은 DBMS 서버가 명령을 수행하는 시간이기 때문이다. 이론 상의 수치인 초당 100,000 레코드에는 자주 도달하지 않는다. DBMS 서버에서 트리거나 인덱스를 반영하는 경우가 흔하기 때문이다. 매우 큰 묶음 INSERT (예: 100,000 레코드 이상)를 처리할 때에는 프라이머리 키 (PK)가 아닌 인덱스를 DROP하고 INSERT가 모두 완료된 후에 다시 생성하면 최대 성능까지 이를 수 있다는 점을 고려하자. 기타 자료 (See Also) Overview (FireDAC) [DocWiki 번역] Array DML (FireDAC) 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.