SlideShare ist ein Scribd-Unternehmen logo
1 von 14
Downloaden Sie, um offline zu lesen
이지민
2019.08.23
DB Lock을 줄이는 5가지 팁
1. Default 컬럼을 추가할 때는 조심하세요.
Postgres SQL 10버전 이하에서는 컬럼을 추가할 때, 테이블을 새로 만들어냅니다.
그래서 테이블이 모두 복사될 때까지 ACCESS EXCLUSIVE 잠금이 발생해요.
1. Default 컬럼 추가 주의사항
1. Default 컬럼 추가 주의사항
ALTER TABLE items ADD COLUMN updated_timestamp timestamptz DEFAULT now();
ALTER TABLE items ADD COLUMN updated_timestamp timestamptz;
UPDATE items SET updated_timestamp = now();
do { numRowsUpdted = executeUpdate(
"UPDATE items SET updated_timestamp = ? " + "WHERE ctid IN (SELECT ctid
FROM items WHERE updated_timestamp IS NULL LIMIT 5000)", now);
} while (numRowsUpdted > 0);
안좋은 사례
좋은 사례
ALTER TABLE items ADD COLUMN deleted DEFAULT null
2. Lock TimeOut을 사용하세요.
1. Default 컬럼 추가 주의사항2. Lock Timeout
쿼리 실행이 지연되어, 오랜시간동안 트랜잭션 경합이 발생할까 두려울 때가 있습니다.
이런 경우, Lock Timeout을 사용하세요.
SET lock_timeout TO ’2s’
ALTER TABLE items ADD COLUMN updated_timestamp timestamptz DEFAULT now();
1. Default 컬럼 추가 주의사항2. Lock Timeout
타임아웃 기간동안 Lock이 해제되지 않는다면, 쿼리가 강제 종료됩니다.
3. 인덱스 추가 시, CONCURRENTLY 옵션을 추가해주세요.
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 명령문만 막습니다.
4. Lock을 발생시키는 쿼리는 최대한 늦게 실행해요.
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;
안좋은 사례
좋은 사례
5. VACCUM FULL은 절대 사용하지말아요.
1. Default 컬럼 추가 주의사항5. VACCUM FULL
PostgreSQL에서는 디스크 정리를 위하여 주기적으로 VACCUM을 실행해야합니다.
VACCUM FULL은 유효한 데이터들을 새로운 테이블에 다시 씁니다.
이 때, 테이블 전체 잠금이 발생할 수 있어서 절대 사용하면 안돼요.
1. Default 컬럼을 추가할 때는 조심하세요.
2. Lock TimeOut을 사용하세요.
3. 인덱스 추가 시, CONCURRENTLY 옵션을 추가해주세요.
4. Lock을 발생시키는 쿼리는 최대한 늦게 실행해요.
5. VACCUM FULL은 절대 사용하지말아요.
정리

Weitere ähnliche Inhalte

Was ist angesagt?

[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영NAVER D2
 
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정PgDay.Seoul
 
Kafka streams 20201012
Kafka streams 20201012Kafka streams 20201012
Kafka streams 20201012한 경만
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용흥배 최
 
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인VMware Tanzu Korea
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리라한사 아
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유Hyojun Jeon
 
[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기NHN FORWARD
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템NAVER D2
 
REST API 설계
REST API 설계REST API 설계
REST API 설계Terry Cho
 
How to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyHow to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyVMware Tanzu
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리Junyi Song
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法yoku0825
 
Multithread design pattern
Multithread design patternMultithread design pattern
Multithread design pattern종빈 오
 
카프카, 산전수전 노하우
카프카, 산전수전 노하우카프카, 산전수전 노하우
카프카, 산전수전 노하우if kakao
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우NAVER D2
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기Jongwon Kim
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint NAVER D2
 

Was ist angesagt? (20)

[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영
 
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
 
Kafka streams 20201012
Kafka streams 20201012Kafka streams 20201012
Kafka streams 20201012
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
How to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyHow to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor Netty
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
Multithread design pattern
Multithread design patternMultithread design pattern
Multithread design pattern
 
카프카, 산전수전 노하우
카프카, 산전수전 노하우카프카, 산전수전 노하우
카프카, 산전수전 노하우
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기
 
Redis
RedisRedis
Redis
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
 

Kürzlich hochgeladen

JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP Korea
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP Korea
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP Korea
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석JMP Korea
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법JMP Korea
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP Korea
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화JMP Korea
 

Kürzlich hochgeladen (8)

JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 

[29DCF] PostgreSQL에서 DB Lock을 줄이는 5가지 팁

  • 2. 1. Default 컬럼을 추가할 때는 조심하세요.
  • 3. Postgres SQL 10버전 이하에서는 컬럼을 추가할 때, 테이블을 새로 만들어냅니다. 그래서 테이블이 모두 복사될 때까지 ACCESS EXCLUSIVE 잠금이 발생해요. 1. Default 컬럼 추가 주의사항
  • 4. 1. Default 컬럼 추가 주의사항 ALTER TABLE items ADD COLUMN updated_timestamp timestamptz DEFAULT now(); ALTER TABLE items ADD COLUMN updated_timestamp timestamptz; UPDATE items SET updated_timestamp = now(); do { numRowsUpdted = executeUpdate( "UPDATE items SET updated_timestamp = ? " + "WHERE ctid IN (SELECT ctid FROM items WHERE updated_timestamp IS NULL LIMIT 5000)", now); } while (numRowsUpdted > 0); 안좋은 사례 좋은 사례 ALTER TABLE items ADD COLUMN deleted DEFAULT null
  • 5. 2. Lock TimeOut을 사용하세요.
  • 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이 해제되지 않는다면, 쿼리가 강제 종료됩니다.
  • 8. 3. 인덱스 추가 시, CONCURRENTLY 옵션을 추가해주세요.
  • 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 명령문만 막습니다.
  • 10. 4. Lock을 발생시키는 쿼리는 최대한 늦게 실행해요.
  • 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; 안좋은 사례 좋은 사례
  • 12. 5. VACCUM FULL은 절대 사용하지말아요.
  • 13. 1. Default 컬럼 추가 주의사항5. VACCUM FULL PostgreSQL에서는 디스크 정리를 위하여 주기적으로 VACCUM을 실행해야합니다. VACCUM FULL은 유효한 데이터들을 새로운 테이블에 다시 씁니다. 이 때, 테이블 전체 잠금이 발생할 수 있어서 절대 사용하면 안돼요.
  • 14. 1. Default 컬럼을 추가할 때는 조심하세요. 2. Lock TimeOut을 사용하세요. 3. 인덱스 추가 시, CONCURRENTLY 옵션을 추가해주세요. 4. Lock을 발생시키는 쿼리는 최대한 늦게 실행해요. 5. VACCUM FULL은 절대 사용하지말아요. 정리