안녕하세요. 이성필 입니다.

 

지난번과 비슷한 플롯(?)으로 .... 오늘은 대량 문자열의 저장 및 처리에 대한 이야기를 짧게...하려 합니다.

아는 지식이 짧아... 함께 논의하였으면 하는 주제를 올리게 되었습니다.
TIP 이라기 보다는 논의 및 방법에 대한 이야기를 함께 했으면 합니다.

 

 (
 제 개인적인 감상으로....
 데이터베이스는 대량 문자열을 저장/검색하기 좋은 솔루션이 아닙니다.
 트랜잭션 및 무결성에 대한 보장으로 파일에 직접 기록하는 것 보다 느리고, 일정길이 이상으로 저장은 살짝 특별한 형태로 해야 합니다.
 정도에 따라 다르겠지만... 대량 Data를 입력/수정을 빈번하게 고성능으로 하고 싶은 경우 데이터베이스를 추천하고 싶지 않습니다.
 )

 

MSSQL은 8000 byte 이상, Oracle의 경우는 4000 byte 이상을 저장해야 할 경우 특별취급을 해 주어야 가능합니다.
MSSQL은 이 경우 varchar(max) 혹은 text 형태를, Oracle은 LONG 혹은 LOB(CLOB, BLOB 등)을 사용해야 합니다.

 

MSSQL을 사용할 당시... 주로 text 를 많이 사용했는데 이럴 경우 살짝 제한이 있었습니다만, 크게 불편한 정도는 아니었습니다.
- text 형태의 Column에 index를 생성할 수 없다.
- 해당 Data type을 parameter로 만들어서 처리하기 곤란하다.
- 비교시 LIKE만을 사용해야 한다.
이외에도 있겠지만... 제가 사용상 불편했던 점은 위와 같습니다. (자세히 기억이 안나네요.. ^^;;)
현재는 varchar(max) 라는 녀석도 생겨서 선택의 폭이 좀 넓어진 느낌입니다.

 

ORACLE에서 제공하는 LOB 형태와 LONG 형태를 비교한 내용입니다.(간략하게 사용성에 관한 것만 추렸습니다)
- Table의 한 ROW에 여러 LOB Column이 있을 수 있는 반면, LONG 또는 LONG RAW Column은 한 ROW에 하나 밖에 사용될 수 없다.
- LOB는 사용자 정의 Data type (user-defined datatype)의 속성 (attribute) 으로 사용 될 수 있는 반면, LONG이나 LONG RAW는 속성으로 사용될 수 없다.
- LONG 또는 LONG RAW는 값 전체가 Table 내에 저장이 되는 반면, LOB는 Table Column내에 LOB locator만 저장이된다.
- LOB 데이터는 4GB까지 저장이 가능하며, BFILE Column이 가리키는 파일 크기는 4GB 이내에서 OS에서 지원하는 최대 크기까지 가능하다. 한편 LONG이나 LONG RAW Data type에서는 2GB 까지만 지원이 가능하다.
- LONG Column의 데이터는 TO_LOB()라는 함수를 사용하여 LOB으로 변환 가능하지만, LOB을 LONG / LONG RAW로 변환 하는 기능은 제공되지 않는다.
이외에 성능상의 비교도 있지만, 이런 형태의 Data를 다루는 일은 주로 성능에 민감한 부분이 아니었으므로 크게 느껴본 기억이 나지 않습니다.
.
.
.
MSSQL -> ORACLE 형태의 Data 이전이나 그 반대로의 이전에서 부딪치는 문제 중에 하나로 이런 특별취급해야 하는 대량 데이터 저장 자료형에 대한 이전입니다.
제 경우는 ORACLE -> MSSQL Data 이전이 많았는데, 그 경우 CLOB이 문제였습니다. linked server를 이용한 openquery나 4-part sql로 가지고 오고 싶었지만, 방법을 찾을 수 없었던 것이 기억납니다. SSIS를 이용한 방법도 실패했습니다.
결국 근본적인 해결은 뒤로 미루고, 파일로 떨어뜨린 후, 파일로 밀어넣었은 경우가 기억납니다.

 

제가 확인한 사실은 "CLOB의 경우 linked server를 이용해서 간단하게 가져올 수 없다" 입니다.
LONG의 경우는 의외로 조회도 입력도 잘 되었습니다. (6만자 정도 text Column에 넣어서 test 해보았습니다만... 별 무리 없었습니다.)

 

결론은 .... "MSSQL 입장에서 ORACLE의 대량 데이터 저장용 자료형 중 CLOB 보다는 LONG이 다루기 쉽다" 였습니다.

 

지금까지의 ORACLE의 입장은 LONG을 버리는 분위기이고, CLOB을 사용하기를 권장합니다.
언급되었듯이, LONG 을 CLOB으로 변환하는 방법은 web에 많이 있지만, 반대의 경우는 아직 못봤습니다.(ㅠㅠ)

 

사실 ... LONG의 경우 ORACLE 입장에서 매우 사용하기 까다로운 자료형이기에 ORACLE 의 방향이 이해되지만서도...
Oracle->MSSQL 로의 Data 이전을 자주 해야 하는 경우 적절한 방법을 모르겠습니다.

 

해결해 본 경험이 있거나... 좋은 방법 있으신 분 알려주셨으면 합니다.
다른 분들은 이런 상황에서 어떤 방법을 사용하셨나요?





profile