2013-10-03 6 views
2

BLOB 필드 데이터를 매개 변수 배열에 전달하는 Array DML INSERT 또는 UPDATE 문을 실행할 수 있습니까? 그리고 가능한 한 내 BLOB 데이터를 포함하는 Array DML 명령이 명령을 하나씩 실행하는 것보다 더 효율적인지 궁금해합니다.BLOB 데이터를 포함하는 Array DML 명령을 실행하는 것이 가능하고 의미가 있습니까?

나는 그것을 할 수 있습니다 가정 있도록 TADParamAsBlobs 인덱스 속성을 가지고 있지만,이과를 보여주는 성능이나 예에 대한 언급이 없기 때문에 나는 아직이 시도하지 않은 것으로 나타났습니다 인덱스 속성은 유형 RawByteString입니다 때문에 어떤 내 필요에별로 적합하지 않습니다.

FireDAC을 사용하고 SQLite 데이터베이스 (Params.BindMode = pbByNumber)로 작업 중이므로 VALUES 인 기본 SQLite INSERT을 사용하고 있습니다. 필자의 목표는 (FireDAC의 추상화 비용으로) 매우 작은 BLOB 데이터 (레코드 당 약 1kB)를 가능한 한 빨리 포함하는 약 100,000 개의 레코드를 저장하는 것입니다.

답변

5

중요한 점은 귀하가 SQLIte3 데이터베이스를 사용하고 있다는 것입니다.

SQLite3의 경우 Array DML은 FireDAC에서 "에뮬레이션"됩니다. 클라이언트 - 서버 인스턴스가 아닌 로컬 인스턴스이므로 여러 행을 준비한 다음 네트워크 대기 시간을 피하기 위해 한 번에 보내야합니다 (Oracle 또는 MS SQL과 같이).

Array DML을 사용하여 은 SQLite3을 사용하여 약간의 삽입 프로세스 속도를 높일 수 있지만 매우 높습니다. 숫자별로 바인딩하는 좋은 일반 INSERT는 잘 작동합니다. (또는 더 나은 데이터의 1000 행 당 하나의 트랜잭션을 사용)

  • 단일 트랜잭션 내에서 둥지 프로세스를; 귀하의 경우 성능에 대한

    주요 팁이 될 것입니다

  • INSERT 문을 준비한 다음 매번 바인딩 된 매개 변수로 다시 실행하십시오.
  • 기본적으로 FireDAC은 SQLite3을 가장 빠른 옵션 (예 : LOCK 비활성화)으로 초기화하므로 그대로 두십시오.

SQlite3은 BLOB 프로세스에 대해 매우 뛰어납니다.

From my tests, FireDAC 삽입 타이밍이 매우 좋으며 직접 SQlite3 액세스에 가깝습니다. Delphi TDataSet 클래스의 오버 헤드로 인해 읽기만이 직접 SQLite3 링크보다 느립니다.