Firebird와 Zeos를 사용하고 있는데요, 테이블에는 기존에 1000만껀의 레코드가 들어있는 상황입니다.
제가 시도했던 것부터 말씀드리면,
처음에는 TZTable.append를 사용해서 데이타를 넣었는데 그때는 그래도 괜찮았습니다. 그런데, 이제 데이타가 들어있는 상태에서 그것을 실행하려니 이게 속도가 장난아니게 떨어지는 겁니다.
그래서, TZQuery.append를 사용해서 데이타를 넣어보았는데 에러가 발생할 때 라이브러리 내부에서 무한루프를 도는 어이없는 씨츄에이션 발생하여, 이것도 포기...
마지막으로 TZQuery.ExecSQL을 사용하려고 하는데, ..
가장 문제가 되는 것은...추가로 넣으려는 데이타가 기존 것과 중복되는 것도 있다는 것입니다. 따라서, 기존 데이타베이스에 이미 중복된 넘이 들어있으면 그건 넣지 말거나 또는 새로운 것으로 대체하고 오류는 제껴버리면서 추가하고자 하는 데이타를 마지막것까지 다 넣는 것이죠.
TZTable에서 OnPostError를 쓸 때는 정상적으로 에러 처리가 잘 되지만, 그걸 사용하면 테이블을 모두 불어들이는 상황이 발생하므로 이제는 쓸 수가 없습니다. 결국 TZQuery를 사용해서 데이타를 입력할 수 밖에 없는 상황인데(혹시 제가 모르는 다른 입력 방법이 있나요?) TZQuery.Append는 OnPostError핸들러로 들어만 가면 무한루프에 빠져들어 버리거나 'Internal Error'라는 희한한 에러를 내고 죽어버리고..
TZQuery.ExecSQL로 실행할때는 OnPostError는 들어가지도 않고..ㅠㅠ
빨리 넣는 방법도 중요하고, 무엇보다 중복된 값이 들어가려고 할때 그것을 어떻게 처리할 것인가를 정해서 내부적으로 오류를 처리해서 입력작업을 계속 수행하는 ...그 방법....그것을 여쭤봅니다. ㅠㅠ
이게 진행이 안되니 다음 단계로 전혀 갈 수 없는 상황이네요. 어흑....
전 주로 Informix 와 Sybase에서 사용했죠 오라클에는 없었어요(Version 6)
이것을 이용한 방법인데
Tempary Table(Drop하지 않아도 Session이 끊어지면 사라지는 테이블)이 없더라도 사용은 가능합니다.
그냥 실제 Table을 만들면 되니깐요
프로그램에서 입력하기 전에 클론 TABLE을 만듭니다.
1. 입력할 테이블과 똑같은 구조의 테이블을 만든다. (CLON_TABLE 라고 정하자)
- 인덱스는 없애는것이 좋습니다.
2. 입력할 데이터의 중복성 검사를 한다.(저장할려고 하는 데이터 내의 중복 데이터 삭제)
- DB가 아니라 로컬의 입력할 데이터중에서 입니다.
3. CRON_TABLE에 입력할 데이터를 입력한다. ( TTABLE도 좋고 TQUERY도 좋고)
4. CRON_TABLE을 본래의 테이블에 입력한다 (본래 테이블 을 ORIGIN_TABLE 라고 정하자)
4-1. CRON_TABLE의 내용을 ORIGIN_TABLE에 저장합시다.(PRIMARY KEY Field는 KEY1, KEY2 라고 합시다)
- EXECSQL로 하시면 됩니다. 다음과 같이요
INSERT INTO ORIGIN_TABLE
SELECT * FROM CRON_TABLE A WHERE NOT EXISTS
(SELECT * FROM ORIGIN_TABLE B WHERE A.KEY1 = B.KEY1 AND A.KEY2 = B.KEY2)
5. CRON_TABLE을 DROP 합는다.
이 방법은 아주 고전적인 방법이에요 벌크 인서트하기 곤란할 때 와 본 테이블에 키가 많고 데이터가
많을경우(약 100여건 .. 그 이상은 벌크가 좋죠) 하는 방법입니다.