본문 바로가기

DB19

[PSQL] COPY 작업 시 유용하게 사용했던 명령어 및 설정 앞서 포스팅한대로 COPY작업 자체는 잘 된다. 하지만 생각지도 못한 부분에서 많은 문제가 발생했다. 1. 한글깨짐 역시나 한글 깨짐 방지는 필수인것 같다. copy 실행 전 SQL Shell의 인코딩을 UTF-8로 변경하면 된다. set client_encoding to 'UTF8'; 2. 구분자 문제 나 같은 경우는 MSSQL에서 데이터를 CSV로 생성 후 PSQL에서 COPY했다. 이때 구분자를 ,을 이용하였는데 데이터 안에 해당 구분자가 들어 있다면 데이터의 , 마저도 구분자로 인식하여 데이터를 컬럼단위로 잘라버렸다. 즉 원래 컬럼이 10개라면 11개가되는 현상이 발생, 정상적으로 실행이 안된다. 이전 포스팅에서 설정한 delimiter 옵션을 이용하여 구분자를 \t, ; 등 상황에 맞게 변경해서.. 2020. 4. 27.
[PostgreSQL] COPY 사용 불가 (SQL Error 42501) 대용량 데이터 복사 시 CSV파일 형태로 저장 후 COPY 명령어를 통해 읽어온다. 하지만 PostgreSQL에서 COPY를 사용하면 must be superuser to copy to or from a file 이라는 에러와 함께 실행되지 않는 경우가 있다. 에러를 보면 파일 접근 관련 권한 문제로 보이는데 로컬 환경에만 작업한다면 괜찮지만 따로 분리된 다른 서버의 DB 사용 시 파일 접근 권한 문제를 마음대로 변경할 수 없다. 따라서 다른 방법을 찾아야만 했는데 다행히 에러문구 밑에 힌트가 적혀있었다. Hint : Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone. 즉, psql의 \copy를 사용하면.. 2020. 4. 27.
[MSSQL] OPENQUERY 대용량 DML 작업 시 문제점 OPENQUERY를 이용하여 POSTGRESQL에 DELETE 및 INSERT 작업을 진행하였다. 적게는 수천건부터 많게는 수백만건 작업을 해아하는데 어째서인지 만건만 넘어가도 서버가 뻗어버렸다. 그 원인은 바로 OPENQUERY의 메커니즘에 있었다. 예를 들어 DELETE FROM MEMBER 가 있다고 가정하면 그냥 POSTGRESQL에서 실행 시 MEMBER의 ROW 수 만큼 삭제되는데 실행계획을 보면 1 EXCUTE된다. 하지만 OPENQUERY 실행 시 ROW 수 = EXCUTE 수가 된다. 즉 하나를 삭제할 때 마다 모든 테이블을 읽어온다는 뜻이다. INSERT도 마찬가지로 INSERT 작업 후 SELECT문을 실행시켜 모든 데이터를 한번 얻어온다고 한다. 직접 확인은 못했지만 아래 링크를 확.. 2020. 4. 22.
[MSSQL] OPENQUERY에 변수 사용 시 문제점 및 해결방법 DECLARE @ID VARCHR(100) SET @ID = 'USER123' DELETE T1 FROM OPENQUERY(DEV, SELECT * FROM TBL_MEMBER WHERE ID = @ID) AS T1 이렇게 OPENQUERY 안에 MSSQL의 DECLARE 변수 사용 시 에러가 발생한다. 해결방법은 OPENQUERY를 변수에 담아 실행시키는 방법이 있다. DECLARE @ID VARCHR(100), @OPENSQL NVARCHR(1000); SET @ID = 'USER123' SET @OPENSQL = N'DELETE T1 FROM OPENQUERY(DEV, SELECT * FROM TBL_MEMBER WHERE ID = '+ @ID +') AS T1' EXECUTE SP_EXCUTESQ.. 2020. 4. 14.