6. 1. Default 컬럼 추가 주의사항2. Lock Timeout
쿼리 실행이 지연되어, 오랜시간동안 트랜잭션 경합이 발생할까 두려울 때가 있습니다.
이런 경우, Lock Timeout을 사용하세요.
7. SET lock_timeout TO ’2s’
ALTER TABLE items ADD COLUMN updated_timestamp timestamptz DEFAULT now();
1. Default 컬럼 추가 주의사항2. Lock Timeout
타임아웃 기간동안 Lock이 해제되지 않는다면, 쿼리가 강제 종료됩니다.
9. 3. 인덱스 추가 주의사항
CREATE INDEX idx_items__brand_id ON items USING brand_id;
CREATE INDEX CONCURRENTLY idx_items__brand_id
ON items USING brand_id;
안좋은 사례
좋은 사례
INDEX 생성 쿼리는 INSERT / UPDATE / DELETE 쿼리를 모두 막아요.
COUNCURRENTLY 옵션을 추가하면 DDL 명령문만 막습니다.
11. 4. Lock 쿼리 호출 시점 주의사항
BEGIN;
-- 기존 테이블 스키마를 그대로 복사합니다
CREATE TABLE temp_items (LIKE items INCLUDING ALL);
-- 테이블에 대량의 데이터를 밀어넣는 쿼리를 실행합니다
COPY items_new FROM 'new_item.csv' WITH CSV
-- 기존 테이블을 삭제하고, 새로운 테이블명으로 이름을 변경합니다
DROP TABLE items;
ALTER TABLE temp_items RENAME TO items;
COMMIT;
BEGIN;
-- item 테이블의 모든 읽기 / 쓰기가 Block 됩니다
TRUNCATE items;
-- 그리고 테이블에 대량의 데이터를 밀어넣는 작업은 시간이 많이 소요됩니다
COPY items FROM ‘new_item.csv' WITH CSV
COMMIT;
안좋은 사례
좋은 사례
13. 1. Default 컬럼 추가 주의사항5. VACCUM FULL
PostgreSQL에서는 디스크 정리를 위하여 주기적으로 VACCUM을 실행해야합니다.
VACCUM FULL은 유효한 데이터들을 새로운 테이블에 다시 씁니다.
이 때, 테이블 전체 잠금이 발생할 수 있어서 절대 사용하면 안돼요.
14. 1. Default 컬럼을 추가할 때는 조심하세요.
2. Lock TimeOut을 사용하세요.
3. 인덱스 추가 시, CONCURRENTLY 옵션을 추가해주세요.
4. Lock을 발생시키는 쿼리는 최대한 늦게 실행해요.
5. VACCUM FULL은 절대 사용하지말아요.
정리